infer infer キーワード
最終更新:2026-10-22
infer infer キーワード
infer は条件型の真分岐の中で型を「捕まえ」ます。T extends Array<infer U> ? U : never は「T が配列なら、その要素型を取り出して U と呼ぶ」という意味です。型のマッチングが「マッチしたら捨てる」から「マッチして抽出する」に進化し、Unwrap や ReturnType のようなユーティリティ型の核心になります。
| グループ | ジェネリクス |
|---|---|
| 種類 | 演算子 |
| strict モード | 不要 |
ℹ️ 説明 エディタは TypeScript を JavaScript にトランスパイルして実行します(型チェックなし)。型チェック結果は各サンプルの出力を参照してください。
📝 構文
type ItemOf<T> = T extends Array<infer U> ? U : never;
type A = ItemOf<string[]>; // string
type B = ItemOf<number[]>; // number
// infer はパターン内の任意の位置に現れられる
type FirstArg<T> = T extends (first: infer A, ...rest: any[]) => any ? A : never;
⚙️ パラメータ
| infer U | 型のプレースホルダ宣言:extends のマッチング過程で、その位置の型を U として捕まえます |
|---|---|
| T extends X ? U : Y | U のスコープ:現在の条件型の真分岐の中でのみ有効で、分岐の外からは見えません |
戻り値:infer 自体は型ではなく、マッチング過程での「束縛」です。条件型全体の戻り値は、捕まえた結果が演算に参加して導かれます。
▶ サンプル
下のコードを編集して「試す」を押すと、トランスパイル実行結果を確認できます:
出力:
11 A
(トランスパイル後の実行出力。n と s はコンパイル時にはそれぞれ number と string です——infer が配列型から要素型を取り出しました)
💡 ポイント
ℹ️ 説明 infer は extends パターンの任意の位置に置けます。Promise<infer U> は resolve 型を、[any, infer R] はタプルの2番目を、(x: infer P) => any はパラメータを捕まえます——位置がそのまま意味です。
💡 ヒント 同名の infer が複数回現れると「候補の統合」が発火します。[infer T, infer T] は [number, number] にマッチして number を得ますが、[string, number] では全体が失敗します——天然の「型の一貫性チェック」です。
⚠️ 注意 infer は条件型の extends 節の中でしか使えません。単独で type U = infer X と書くのは構文エラーです。false 分岐の中で U を参照することもできません。
🏷️ 関連ジェネリクス
💡 関連ケース
ケースは今後追加予定です。
📚 関連チュートリアル
❓ よくある質問
Q infer とジェネリックパラメータ <T> の違いは何ですか?
A ジェネリックパラメータは「呼び出し側が私にくれる」もので、infer は「既存の型から取り出す」ものです。前者は入力の宣言、後者は情報の採掘——ReturnType<T> は関数型から戻り値を infer しています。
Q マッチしなかったとき、infer が捕まえた U はどうなりますか?
A マッチしなければ束縛もありません——ただちに false 分岐に進みます。だから false 分岐にはフォールバックとして never や unknown を書くのが普通です。
Q 組み込みユーティリティの中で infer を使っているのはどれですか?
A ReturnType、Parameters、ConstructorParameters、Awaited などです。すべて extends + infer の組み合わせであり、infer を習得すればユーティリティ型のソースコードの大半が読めるようになります。