Typescript で infer キーワードが必要なのはなぜですか? 質問する

Typescript で infer キーワードが必要なのはなぜですか? 質問する

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; }
  • ここで私たちは宣言します新しいRの型変数MyType、これは推測されるからT
  • は、aの節infer内でのみ使用されることに注意してください。extends条件型

がない場合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; }

遊び場

おすすめ記事