迹忆客 专注技术分享

当前位置:主页 > 学无止境 > WEB前端 > React >

解决 React 错误 JSX element type does not have any construct or call signatures

作者:迹忆客 最近更新:2022/10/24 浏览次数:

当我们尝试将元素或 React 组件作为参数传递给另一个组件但输入的参数不正确时,会出现错误“JSX element type does not have any construct or call signatures”。 要解决该错误,需要使用 React.ElementType 类型。

React JSX element type does not have any construct or call signatures

下面是产生该错误的示例代码。

import React from 'react';

interface Props {
  comp: JSX.Element;
}

const Wrapper: React.FunctionComponent<Props> = props => {
  const {comp: Comp} = props;
  // ⛔️ JSX element type 'Comp' does not have any construct or call signatures.ts(2604)
  return (
    <div>
      <Comp name="jiyik.com" />
    </div>
  );
};

const App: React.FunctionComponent = () => {
  const heading = ({name}: {name: string}) => <h2>Hello {name}</h2>;

  return (
    <div>
      <Wrapper comp={heading} />
    </div>
  );
};

export default App;

我们试图将 React 组件作为 prop 传递给 Wrapper 组件,但已将其键入为 JSX.Element

为了解决这个错误,我们必须将 prop 键入为 React.ElementType

import React from 'react';

interface Props {
  comp: React.ElementType; // 👈️  React.ElementType
}

const Wrapper: React.FunctionComponent<Props> = props => {
  // 👇️ 组件名称必须以大写字母开头
  const {comp: Comp} = props;
  return (
    <div>
      <Comp name="jiyik.com" />
    </div>
  );
};

const App: React.FunctionComponent = () => {
  // 👇️ 获取 name 参数
  const heading = ({name}: {name: string}) => <h2>Hello {name}</h2>;

  return (
    <div>
      <Wrapper comp={heading} />
    </div>
  );
};

export default App;

请注意,可以为 React.ElementType 传递元素期望的属性类型的泛型。

在这个例子中,我们必须向它传递一个具有字符串类型名称属性的对象,因为这是标题组件所采用的属性。

import React from 'react';

interface Props {
  // ✅ 显式输入属性 name
  comp: React.ElementType<{name: string}>;
}

const Wrapper: React.FunctionComponent<Props> = props => {
  // 👇️ 组件名称必须以大写字母开头
  const {comp: Comp} = props;
  return (
    <div>
      <Comp name="jiyik.com" />
    </div>
  );
};

const App: React.FunctionComponent = () => {
  const heading = ({name}: {name: string}) => <h2>Hello {name}</h2>;

  return (
    <div>
      <Wrapper comp={heading} />
    </div>
  );
};

export default App;

现在我们显式地键入了 comp 元素在使用时所采用的 props。 这有助于我们在将属性传递给组件时利用我们的 IDE 进行自动完成。

我们也可以使用 React.ComponentType 但是我们需要输入 props。

import React from 'react';

interface Props {
  // 👇️ 现在使用 React.ComponentType 👇️
  comp: React.ComponentType<{name: string}>;
}

const Wrapper: React.FunctionComponent<Props> = props => {
  // 👇️ 组件名称必须以大写字母开头
  const {comp: Comp} = props;
  return (
    <div>
      <Comp name="jiyik.com" />
    </div>
  );
};

const App: React.FunctionComponent = () => {
  const heading = ({name}: {name: string}) => <h2>Hello {name}</h2>;

  return (
    <div>
      <Wrapper comp={heading} />
    </div>
  );
};

export default App;

React.ComponentType 中的泛型不默认为 any 类型,因此我们需要显式键入 props。

请注意,如果我们将 JSX 元素作为 props 传递给组件而不是实际组件,则 JSX.Element 是正确的类型。

import React from 'react';

interface Props {
  // 👇️ 使用 JSX.Element 类型
  comp: JSX.Element;
}

const Wrapper: React.FunctionComponent<Props> = props => {
  const {comp: Comp} = props;

  // 👇️ use as {Comp}
  return <div>{Comp}</div>;
};

const App: React.FunctionComponent = () => {
  const Heading = ({name}: {name: string}) => <h2>Hello {name}</h2>;

  // 👇️ 我们传递了一个实际的 JSX 元素,因为我们没有将它作为 comp={Heading} 传递
  return (
    <div>
      <Wrapper comp={<Heading name="jiyik.com" />} />
    </div>
  );
};

export default App;

显示结果为

React JSX element type does not have any construct or call signatures 解决示例

我们将 comp 属性键入为 JSX.Element ,因为我们将实际的 JSX 元素(不是组件)传递给 Wrapper 组件。

我们正在传递一个 JSX 元素,因为我们将 prop 传递为 comp={<Heading />} 而不是 comp={(props) => <h2>Hello world</h2>}

注意 ,在第一种情况下,我们传递了一个 JSX 元素作为属性,而在第二种情况下,我们传递了一个返回 JSX 元素(功能组件)的函数。

我们不应该尝试将 JSX 元素用作 Wrapper 组件中的组件,例如 不要做<Comp />,而是{Comp}

我们没有传递一个实际的组件作为属性,我们传递了一个 JSX 元素,所以它不应该被用作一个组件。

如果之前的建议都没有帮助,请尝试通过运行以下命令来更新 React 类型的版本。

# 👇️ 使用 NPM
$ npm install react@latest react-dom@latest

$ npm install --save-dev @types/react@latest @types/react-dom@latest

# ----------------------------------------------

# 👇️ 使用 YARN
$ yarn add react@latest react-dom@latest

$ yarn add @types/react@latest @types/react-dom@latest --dev

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

在 React 中循环遍历对象数组

发布时间:2023/03/18 浏览次数:124 分类:React

在 React 中循环对象数组: 使用 map() 方法迭代数组。 我们传递给 map() 的函数会为数组中的每个元素调用。 该方法返回一个新数组,其中包含传入函数的结果。 export default function App (

获取 React 中元素的类名

发布时间:2023/03/18 浏览次数:162 分类:React

在 React 中使用 event.target 获取元素的类名 获取元素的类名: 将元素上的 onClick 属性设置为事件处理函数。 访问元素的类名作为 event.currentTarget.className 。 export default function App () { cons

如何将 key 属性添加到 React 片段

发布时间:2023/03/18 浏览次数:152 分类:React

使用更详细的片段语法将 key 属性添加到 React 片段,例如 React.Fragment key={key} 。 更冗长的语法实现了相同的结果对元素列表进行分组,而不向 DOM 添加额外的节点。 import React from react

如何在 React 中删除事件监听器

发布时间:2023/03/15 浏览次数:203 分类:React

在 React 中删除事件监听器: 在 useEffect 挂钩中添加事件侦听器。 从 useEffect 挂钩返回一个函数。 当组件卸载时,使用 removeEventListener 方法移除事件监听器。 import {useRef, useEffect} from r

React 中在 map() 中使用条件跳出map

发布时间:2023/03/15 浏览次数:198 分类:React

React 中在 map() 中使用条件: 在数组上调用 map() 方法。 使用 if 条件,如果条件满足则显式返回。 否则返回不同的值或返回 null 以不呈现任何内容。 export default function App () { const arr =

在 React 中调用多个 onClick 函数

发布时间:2023/03/15 浏览次数:160 分类:React

在 React 中调用多个 onClick 函数: 在元素上设置 onClick 属性。 在事件处理函数中调用其他函数。 事件处理函数可以根据需要调用尽可能多的其他函数。 export default function App () { const s

在 React 中按类名查找所有元素

发布时间:2023/03/15 浏览次数:171 分类:React

在 React 中通过 className 查找所有元素: 使用 getElementsByClassName 方法获取具有特定类的所有元素。 将对该方法的调用放在 useEffect() 钩子中。 import {useEffect} from react ; const App = () = { useEf

在 React 中检查元素是否获取到焦点

发布时间:2023/03/15 浏览次数:154 分类:React

要检查元素是否在 React 中获得焦点: 在元素上设置 ref 属性。 元素呈现后,检查元素是否是文档中的活动元素。 如果是,则该元素被聚焦。 import {useEffect, useRef} from react ; export defaul

在 React 中悬停时显示元素或文本

发布时间:2023/03/13 浏览次数:160 分类:React

在 React 中悬停时显示元素或文本: 在元素上设置 onMouseOver 和 onMouseOut 属性。 跟踪用户是否将鼠标悬停在状态变量中的元素上。 根据状态变量有条件地渲染另一个元素。 import {useStat

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便