1. ホーム
  2. typescript

[解決済み] なぜTypescriptではinferキーワードが必要なのでしょうか?

2022-03-02 08:29:54

質問

なぜTypescriptの人たちは infer というキーワードがあります。 によると ドキュメント , これはその使い方の例です。

type ReturnType<T> = T extends (...args: any[]) => infer R ? R : any;

なぜこれが必要なのか理解できない。なぜ、それだけではダメなのか。

type ReturnType<T> = T extends (...args: any[]) => R ? R : any;

なぜうまくいかないのか?なぜ infer というキーワードが必要なのでしょうか?

どのように解決するのですか?

infer この場合、コンパイラはすべての型変数を宣言したことを確認します。 明示的に :

type MyType<T> = T extends infer R ? R : never;
type T1 = MyType<{b: string}> // T1 is { b: string; }

ここでは 新しい 型変数 RMyType は、どの 推論される から T .
( なお、この infer は常に extends の句は 条件付きタイプ . )

宣言されていない型パラメーターを使用すると、コンパイルエラーになることがあるようになりました。

type MyType2<T> = T extends R2 ? R2 : never; // error, R2 undeclared

なし infer この場合、コンパイラは追加の型変数を導入したいのかどうかがわかりません。 R2 が推論される場合(最初のケースを参照)、あるいは R2 は、単なる偶然のタイプミス/タイポです。 infer は、この曖昧さをなくすために存在します。

より正確には、コンパイラは、もし T が代入可能かどうか から R の場合 infer が省略されます。

type R = { a: number }
type MyType3<T> = T extends R ? R : never; // compare T with type R
type T2 = MyType2<{b: string}> // T2 is never

なお、この infer R は、同じ名前の型宣言の型参照に影を落としています。 R :

type R = { a: number }
type MyType<T> = T extends infer R ? R : never;
type T1 = MyType<{b: string}> // { b: string; }

遊び場