错误“JSX 元素类型 '...' 没有任何构造或调用签名”是什么意思?

IT技术 reactjs typescript
2021-04-21 03:00:59

我写了一些代码:

function renderGreeting(Elem: React.Component<any, any>) {
    return <span>Hello, <Elem />!</span>;
}

我收到一个错误:

JSX 元素类型Elem没有任何构造或调用签名

这是什么意思?

6个回答

这是构造函数实例之间的混淆

请记住,当您在 React 中编写组件时:

class Greeter extends React.Component<any, any> {
    render() {
        return <div>Hello, {this.props.whoToGreet}</div>;
    }
}

你这样使用它:

return <Greeter whoToGreet='world' />;

不会这样使用它:

let Greet = new Greeter();
return <Greet whoToGreet='world' />;

在第一个示例中,我们传递了组件Greeter构造函数这才是正确的用法。在第二个例子中,我们绕过一个实例Greeter这是不正确的,并且会在运行时失败,并显示“对象不是函数”之类的错误。


这段代码的问题

function renderGreeting(Elem: React.Component<any, any>) {
    return <span>Hello, <Elem />!</span>;
}

是它的预期的情况下React.Component你需要的是一个函数,构造函数React.Component

function renderGreeting(Elem: new() => React.Component<any, any>) {
    return <span>Hello, <Elem />!</span>;
}

或类似:

function renderGreeting(Elem: typeof React.Component) {
    return <span>Hello, <Elem />!</span>;
}
在撰写本文时,如果您正在使用@types/react它们,则最容易使用function RenderGreeting(Elem: React.ComponentType) { ... }
2021-05-27 03:00:59
谢谢。如果我们想传递一个无状态的功能组件会是什么情况?我想function renderGreeting (Elem: new() => React.SFC<any>){...}如果是这样,我们为什么要像这样声明 SFC 的类型: const Hello:React.SFC<any> = (props) => <div>Hello World</div>,而不是:const Hello: new() =>React.SFC<any> = (props) => <div>Hello World</div>
2021-06-04 03:00:59
export const BackNavigationTextWrapper = (WrappedComponent: typeof React.Component) => { const BackNavigationTextWrappedComponent = (props, { commonElements = {} }: any) => { return <WrappedComponent {...props} backLabel={commonElements.backLabel || 'Go back to reservation details'} /> }; BackNavigationTextWrappedComponent.type = WrappedComponent.type; return BackNavigationTextWrappedComponent; }; 我收到错误消息“类型‘typeof Component’上不存在属性‘type’”。
2021-06-07 03:00:59
只是好奇,我们如何function renderGreeting(Elem: typeof React.Component)在 ES6 中编写
2021-06-10 03:00:59
@Jthorpe 您的评论应该是该 IMO 的答案和被接受的评论。
2021-06-18 03:00:59

如果要将组件类作为参数(相对于实例),请使用React.ComponentClass

function renderGreeting(Elem: React.ComponentClass<any>) {
    return <span>Hello, <Elem />!</span>;
}
现在混合了功能组件,您可能应该使用React.ComponentType<any>类型来代替它们。
2021-06-12 03:00:59

当我从 JSX 转换到 TSX 并且我们将一些库保留为 js/jsx 并将其他库转换为 ts/tsx 我几乎总是忘记更改 TSX\TS 文件中的 js/jsx 导入语句

import * as ComponentName from "ComponentName";

import ComponentName from "ComponentName";

如果从 TSX 调用旧的 JSX (React.createClass) 样式组件,则使用

var ComponentName = require("ComponentName")

如果您将 TypeScript(即 in tsconfig.json配置allowSyntheticDefaultImports. 请参阅:typescriptlang.org/docs/handbook/compiler-options.html 和讨论在这里:blog.jonasbandi.net/2016/10/...
2021-05-25 03:00:59
我想你的意思是反过来?
2021-06-12 03:00:59

以下对我有用:https : //github.com/microsoft/TypeScript/issues/28631#issuecomment-472606019我通过执行以下操作来修复它:

const Component = (isFoo ? FooComponent : BarComponent) as React.ElementType
谢谢,它对我帮助很大。<3
2021-05-25 03:00:59
您可能不必输入为React.ElementType. 检查组件(即FooComponent BarComponent)是否为假可能就足够了stackoverflow.com/questions/53452966/...
2021-06-18 03:00:59

如果您将功能组件作为props传递给另一个组件,请使用以下内容:

import React from 'react';

type RenderGreetingProps = {
  element: React.FunctionComponent<any>
};

function RenderGreeting(props: RenderGreetingProps) {
  const {element: Element} = props;

  return <span>Hello, <Element />!</span>;
}