2017-06-28 8 views
0

はケースです:Typescriptで適切な汎用調和を作るには?ここ

interface IValue {a:string} 
interface IFactory<T> { make():T } 

class Factory{ 
    make(): IValue { return {a: 'a'}; } 
} 

const b = function<T extends IValue>(factory?: IFactory<T>): T { 
    return factory.make() || new Factory().make(); // marked as invalid 
    // With error:TS2322:Type 'IValue' is not assignable to type 'T'. 
}; 

b機能は、必要に応じて値の工場を受け入れるか、それがデフォルトで行われます。これは私が持っているより複雑なコードの簡単な例です。

私はIValue!= T(はIValueの子として現れます)を理解していますが、IValueの子供だけでなく、正確にIValueタイプを含むことが期待される調和をどうすればいいですか?

+0

コード**は、「IValue」タイプそのもののために働いています!代わりに、どの子タイプでも機能していません。 –

+1

戻り値の型 'T'について知るには' b'が必要ですか?今は 'ファクトリー'を取るこ​​とはできず、 'T extends IValue'を提供することは期待できません。 –

答えて

0

戻り値をTにキャストしてコンパイルします。 しかし、別のバグがあります。factoryが無効な場合、実行時にエラーが発生します。私はそれを修正した。以下のコードを確認してください。

const b = function <T extends IValue>(factory?: IFactory<T>): T { 
    //return factory.make() || <T>new Factory().make(); // runtime error 
    return <T>(factory || new Factory()).make(); 
}; 
関連する問題