2017-02-10 16 views
2

下のv2の初期化では、次のようになります。Type 'T[keyof T]' cannot be converted to type 'number'.何が問題なのですか?Typescript型ガードがジェネリック型のコンテキストで動作するにはどうすればよいですか?

private func<T extends Object>(o:T, prop: keyof(T)): void { 
    const val = o[prop] 
    if (typeof val === 'number') { 
     const v2: number = val as number 
    } 
} 

これは、以下、非ジェネリックコンテキストで動作[UPDATE]が、発信者のみがオブジェクト自体の特性を使用することができるので、これは、回避策として有用ではありません。

private func2(o:Object, prop: keyof(Object)): void { 
    const val = o[prop] 
    if (typeof val === 'number') { 
     const v2: number = val as number 
    } 
} 

これは私が問題に集中するために抽出した愚かな例です。本当の文脈が助けになるなら、私に知らせてください。

+0

数字にキャストする必要がありますか?タイプが推論されていませんか? –

+1

@MuratK。私がキャストしなければ同じエラー(わずかに異なる言葉で)が起こります。私はキャストを含めました。なぜなら、もし私がいなければ、私はそれを試してほしいというコメントを得ることができたからです! ;-) –

+0

このケースでタイプガードがうまくいかない理由をもっと専門家が説明できれば、感謝しています。私はそれに問題(バグ報告)を書くかどうか疑問に思います。 –

答えて

1

私は活字体に新しいですが、あなたはそれ以外にも提案here

private func1<T extends Object>(o:T, prop: keyof(T)): void { 
    const val = o[prop] 
    if (typeof val === 'number') { 
     const v2: number = val as any as number 
    } 

としてそれをキャスト倍にする必要がありますが、この多分ようにそれを使用することができますように私には思えますか?私は少なくともドキュメントでそれを読んでいます。 Section Index Types

private func<T extends Object, K extends keyof T>(o: T, prop: K): void { 
    const val = o[prop] 
    if (typeof val === 'number') { 
     const v2 = val as any as number 
    } 
} 

希望します。

関連する問題