Что означает ошибка "тип элемента JSX '...' не имеет никаких сигнатур конструкции или вызова"?
Я написал код:
function renderGreeting(Elem: React.Component<any, any>) {
return <span>Hello, <Elem />!</span>;
}
Я получаю сообщение об ошибке:
тип элемента JSX
Elemне имеет никаких сигнатур конструкции или вызова
что это значит?
5 ответов:
это путаница между конструкторы и экземпляров.
помните, что когда вы пишете компонент в 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>; }
Если вы хотите взять класс компонента в качестве параметра (против экземпляра), используйте
React.ComponentClass:function renderGreeting(Elem: React.ComponentClass<any>) { return <span>Hello, <Elem />!</span>; }
когда я конвертирую из JSX в TSX, и мы сохраняем некоторые библиотеки как js/jsx и конвертируем другие в ts/tsx, я почти всегда забываю изменить операторы импорта js / jsx в файлах TSX\TS из
import * as ComponentName from "ComponentName";до
import ComponentName from "ComponentName";при вызове старого JSX (React.createClass) компонент стиля из TSX, затем используйте
var ComponentName = require("ComponentName")
Если вы действительно не заботятся о реквизите, то широкое типа
React.ReactType.Это позволит передавать собственные элементы dom в виде строки.
React.ReactTypeохватывает все эти:renderGreeting('button'); renderGreeting(() => 'Hello, World!'); renderGreeting(class Foo extends React.Component { render() { return 'Hello, World!' } });
если вы используете материал-ui, перейдите к определению типа компонента, который подчеркивается TypeScript. Скорее всего, вы увидите что-то вроде этого
export { default } from './ComponentName';у вас есть 2 варианта устранения ошибки:
1.Добавить
.defaultпри использовании компонента в JSX:import ComponentName from './ComponentName' const Component = () => <ComponentName.default />2.Переименуйте компонент, который экспортируется как "default", при импорте:
import { default as ComponentName } from './ComponentName' const Component = () => <ComponentName />таким образом, вам не нужно указывать
.defaultкаждый время использования компонента.
Comments