开发者问题收集

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

2015-08-04
534450

我写了一些代码:

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

我收到一个错误:

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

这是什么意思?

3个回答

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

请记住,当你在 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>;
}
Ryan Cavanaugh
2015-08-04

如果要将组件类作为参数(而不是实例),请使用 React.ComponentClass

function renderGreeting(Elem: React.ComponentClass<any>) {
    return <span>Hello, <Elem />!</span>;
}
Luke
2017-07-03

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

const Component = (isFoo ? FooComponent : BarComponent) as React.ElementType
Warao
2020-02-20