Typescriptの開発者はなぜこのinfer
キーワードを作ったのでしょうか?文書使用例は以下のようになります:
type ReturnType<T> = T extends (...args: any[]) => infer R ? R : any;
なぜこれが必要なのか理解できません。なぜこうできないのでしょうか:
type ReturnType<T> = T extends (...args: any[]) => R ? R : any;
なぜこれが機能しないのですか?infer
キーワードはなぜ必要なのですか?
ベストアンサー1
を使用するとinfer
、コンパイラはすべての型変数が宣言されていることを確認します。明示的に:
type MyType<T> = T extends infer R ? R : never;
type T1 = MyType<{b: string}> // T1 is { b: string; }
がない場合infer
、コンパイラはR2
推論される追加の型変数を導入しません(最初のケースを参照)。R2
が宣言されていない場合は、コンパイル エラーが発生します。
type MyType2<T> = T extends R2 ? R2 : never; // error, R2 undeclared
より正確には、コンパイラは以下をチェックします。T
割り当て可能R
が省略されている場合infer
:
type R = { a: number }
type MyType3<T> = T extends R ? R : never; // compare T with type R
type T3 = MyType3<{b: string}> // T3 is never
infer R
同じ名前の型宣言の型参照をシャドウすることに注意してくださいR
。
type R = { a: number }
type MyType4<T> = T extends infer R ? R : never;
type T4 = MyType4<{b: string}> // { b: string; }