Essa é uma confusão entre construtores e instâncias .
Lembre-se de que quando você escreve um componente no React:
class Greeter extends React.Component<any, any> {
render() {
return <div>Hello, {this.props.whoToGreet}</div>;
}
}
Você o usa desta maneira:
return <Greeter whoToGreet='world' />;
Você não o usa desta maneira:
let Greet = new Greeter();
return <Greet whoToGreet='world' />;
No primeiro exemplo, estamos divulgando Greeter
a função construtora do nosso componente. Esse é o uso correto. No segundo exemplo, estamos passando uma instância de Greeter
. Isso está incorreto e falhará em tempo de execução com um erro como "Objeto não é uma função".
O problema com este código
function renderGreeting(Elem: React.Component<any, any>) {
return <span>Hello, <Elem />!</span>;
}
é que está esperando uma instância de React.Component
. O que você quer uma função que leva um construtor para React.Component
:
function renderGreeting(Elem: new() => React.Component<any, any>) {
return <span>Hello, <Elem />!</span>;
}
ou similarmente:
function renderGreeting(Elem: typeof React.Component) {
return <span>Hello, <Elem />!</span>;
}
@types/react
-los é mais fácil de usarfunction RenderGreeting(Elem: React.ComponentType) { ... }