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 : YU のスコープ:現在の条件型の真分岐の中でのみ有効で、分岐の外からは見えません

戻り値: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 を習得すればユーティリティ型のソースコードの大半が読めるようになります。
Web-Tutorial.com

Web-Tutorial 技術チーム

複数の開発者によって共同維持されているプログラミングチュートリアルプラットフォーム。各チュートリアルは専門分野の開発者が執筆・レビューしています。正確で信頼性の高いコンテンツを目指しています — 問題を見つけた場合はお知らせください。

100%