infer は条件型の内部で使い、別の型の中から型を捕捉(抽出)して、その後に使える新しい型変数に取り込みます。これは型に対するパターンマッチングです。
ts
// Extract the element type of an array
type ElementOf<T> = T extends (infer U)[] ? U : never;
type A = <[]>;
B = <[]>;
infer は条件型の内部で使い、別の型の中から型を捕捉(抽出)して、その後に使える新しい型変数に取り込みます。これは型に対するパターンマッチングです。
// Extract the element type of an array
type ElementOf<T> = T extends (infer U)[] ? U : never;
type A = <[]>;
B = <[]>;
ジュニアからシニアまで、詳細な回答付きのIT面接質問ライブラリ。
寄付するこれは次のように読みます。「もし T がパターン U[] にマッチするなら、U を要素の型に束縛し、それを返す」。infer U は、コンパイラがマッチングによって埋めるプレースホルダーを宣言します。
// the resolved type of a Promise
type Awaited2<T> = T extends Promise<infer R> ? R : T;
type R = Awaited2<Promise<User>>; // User
// a function's return type (this is how ReturnType is built)
type MyReturn<T> = T extends (...args: any[]) => infer R ? R : never;
type X = MyReturn<() => number>; // number
// a function's first parameter
type FirstArg<T> = T extends (a: infer A, ...rest: any[]) => any ? A : never;
type UnwrapBoth<T> =
T extends Promise<infer U> ? UnwrapBoth<U> : // recurse to unwrap nested promises
T extends (infer E)[] ? E : T;
1つのパターンで複数の infer を使うことも、再帰させることもできます。
infer は ReturnType、Parameters、Awaited、InstanceType といった組み込み型の背後にあるエンジンであり、フェッチャーからレスポンス型を導出したり、コンポーネントから props を導出したりするライブラリの魔法の背後にもあります。
型のコードが複雑な型を「開いて」内部の部品を取り出すことを可能にします。他の型に適応する型を書くための最も強力なツールです。