2015-10-18 52 views
2

下面的實例是一個例子來說明一個問題:爲什麼打字稿編譯犯規允許返回類

首先我有一個作出反應,我們對組件的定義的打字稿定義:

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繼承一切。

回答

4

可能是你應該寫

function Test<T extends React.Component<any, any>>(): T 
{ 
    return new App(); 
} 
0

權!對我來說這是非常漫長的一天。

我還是不明白什麼。我已經爲TSD反應,終極版具有以下定義:

export interface ClassDecorator { 
    <T extends ComponentLifecycle<any, any>>(target:T): T; 
} 

export function connect(mapStateToProps?: MapStateToProps, 
          mapDispatchToProps?: MapDispatchToPropsFunction|MapDispatchToPropsObject, 
          mergeProps?: MergeProps, 
          options?: Options): ClassDecorator; 

而在其他文件,其中我用它,我有

export default connect(
    mapStateToProps, 
    mapDispatchToProps 
)(App); 

,它的工作。爲什麼我不需要傳遞新的應用程序()? 該應用程序與第一個問題是相同的類。 ComponentLifecycle是由React.Component實現的接口。當我將ComponentLifecycle更改爲tsd文件中的組件時,我的代碼不能編譯。

+0

React組件始終作爲*構造函數*傳遞,而不是類實例。你基本上不應該在用戶代碼中編寫新的App()' - React是負責管理類實例化的庫。 –

+0

我知道我不應該創建React組件的實例。問題是我不知道爲什麼我可以傳遞React Component的構造函數作爲此具體示例中的方法的參數,以及爲什麼當我將ComponentLifecycle 中的定義更改爲Component 時,我無法做到這一點。組件是一個類,ComponentLifecycle是一個接口,但它不應該在這裏 – niba

+0

好的。我發現問題。 ComponentLifecycle接口在定義中只有可選的類型。這表明編譯器允許你傳遞構造函數。 – niba