下面的實例是一個例子來說明一個問題:爲什麼打字稿編譯犯規允許返回類
首先我有一個作出反應,我們對組件的定義的打字稿定義:
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> {
}
我想要一個函數返回一個Component的實例。
function Test<T extends React.Component<any, any>>(): T
{
return App;
}
Typescript編譯器不允許我這樣做。錯誤是:
住宅「的setState」缺少在類型「的typeof應用」
我不明白,因爲類應該從Component繼承一切。
React組件始終作爲*構造函數*傳遞,而不是類實例。你基本上不應該在用戶代碼中編寫新的App()' - React是負責管理類實例化的庫。 –
我知道我不應該創建React組件的實例。問題是我不知道爲什麼我可以傳遞React Component的構造函數作爲此具體示例中的方法的參數,以及爲什麼當我將ComponentLifecycle中的定義更改爲Component 時,我無法做到這一點。組件是一個類,ComponentLifecycle是一個接口,但它不應該在這裏 –
niba
好的。我發現問題。 ComponentLifecycle接口在定義中只有可選的類型。這表明編譯器允許你傳遞構造函數。 – niba