2017-05-05 16 views
1

これはTypeScriptの機能を超えているのですか、何か間違っていますか?ここでの作業を持っているように、私が持っているだろういくつかのコードは次のとおりです。Typescriptサブジェネリック型の推論

interface ISquare { 
    area: number; 
} 

interface ICircle { 
    radius: number; 
} 

abstract class Morph<T1, T2> { 
    firstOption: T1; 
    secondOption: T2; 
} 

class CircleAndSquare extends Morph<ICircle, ISquare> { } 

function returnSecondOption<TMorph extends Morph<T1, T2>, T1, T2> (morph: TMorph): T2 { 
    return morph.secondOption; 
} 

returnSecondOption(new CircleAndSquare()) // adding a . here should give me intellisense for a square 

インテリセンスが、私はreturnSecondOptionへの関数呼び出しの終わりにドットを置くISquareのメンバーを表示する必要がありますが、それはない、それT1とT2が{}と表示されているようです。

答えて

0

genericパラメータの場合、extendsは本当に弱い制約になります。言い換えれば

TMorph extends Morph<T1, T2>は、例えばTMorphは次のように拡張することができるので、TMorphsecondOptionは、常にT2であることを推測するのに十分な情報を提供していません:

class BadMorph extends Morph<ICircle, ISquare> { 
    secondOption: ISquare & { radius: string } 
} 

secondOptionは本当にもうなぜならICircleではありませんradiusは現在であり、実質的に{}に相当します。

もう一つは、それが現在の質問に書かれているようTMorphジェネリックパラメータはreturnSecondOptionに本当に必要ないということですので、あなたはそれを取り除くことができます。

function returnSecondOption<T1, T2> (morph: Morph<T1, T2>): T2 { 
    return morph.secondOption; 
} 

とにかくMorph<T1, T2>と互換性のあるものを取るだろう、推論はs: ISquareツールチップで表示されtypescriptです遊び場に

let s = returnSecondOption(new CircleAndSquare()); 

に動作します。

引数の正確なタイプについては、実際にreturnSecondOptionに名前が必要な場合、推論作業を行う方法がわかりません。あなたは

function returnSecondOptionGeneric2<TMorph, T1, T2> (morph: TMorph & Morph<T1, T2>): T2 { 
    return morph.secondOption; 
} 

を試すことができますが、私はこの変形を行うことができますかわからないんだけど。

+0

'function returnSecondOption (morph:Morph ):T2'が正しいです。私は、OPのシナリオでより複雑なものが保証されているものは見当たりません。 –