Вот пример, иллюстрирующий проблему:Почему машинопись компилятор оленья кожа позволяют возвращать экземпляр класса
Сначала я машинопись определение для React, где у нас есть определение для компонента:
class Component<P, S> implements ComponentLifecycle<P, S> {
static propTypes: ValidationMap<any>;
static contextTypes: ValidationMap<any>;
static childContextTypes: ValidationMap<any>;
static defaultProps: Props<any>;
constructor(props?: P, context?: any);
setState(f: (prevState: S, props: P) => S, callback?:() => any): void;
setState(state: S, callback?:() => any): void;
forceUpdate(callBack?:() => any): void;
render(): JSX.Element;
props: P;
state: S;
context: {};
refs: {
[key: string]: Component<any, any>
};
}
Затем в приложении я создал класс, который расширяет компонент.
class App extends React.Component<any, any> {
}
И хотел бы иметь функцию, которая возвращает экземпляр компонента.
function Test<T extends React.Component<any, any>>(): T
{
return App;
}
Составитель машинописного машиностроения не позволяет мне это делать. Ошибка:
Свойство «SetState» отсутствует в типе «TypeOf App»
Я не понимаю, потому что класс должен наследовать все от Component.
Реагирующие компоненты всегда передаются как * конструкторские функции *, а не экземпляры классов. Вы никогда не должны писать 'new App()' в коде пользователя. React - это библиотека, отвечающая за управление экземпляром класса. –
Я знаю, что я не должен создавать экземпляры React Components. Проблема в том, что я не знаю, почему я могу передать конструкторную функцию React Component в качестве аргумента метода в этом конкретном примере и почему я не могу этого сделать, когда я изменяю определение из ComponentLifecycle на компонент . Компонент - это класс, а ComponentLifecycle - это интерфейс, но он не имеет значения здесь –
niba
Хорошо. Я нашел проблему. Интерфейс ComponentLifecycle имеет только необязательные типы внутри определения. Это приводит к тому, что компилятор позволяет передать функцию конструктора. – niba