Dev Study
← 解説「infer — 条件型の中で型を取り出す」に戻る

サンプルコードで身につける: infer — 条件型の中で型を取り出す

解説で学んだ概念を、5つの具体例で確認します。素朴な例から実務寄りの例へと進みます。

1配列から要素の型を取り出す

infer の最も素朴な使い方です。T extends (infer E)[] は「T が何かの配列なら、その要素の型を E と名付けて捕まえる」という意味で、true 側で E を返せます。配列でなかった場合は never を返すのが定番です。

TypeScript

2Promise の中身の型を取り出す

ジェネリック型の型引数の位置にも infer を書けます。Promise<infer V> とすれば非同期処理の結果の型だけが取り出せます。false 側に T を返しておけば「Promise ならむいて、そうでなければそのまま」という柔軟な型になります。

TypeScript

3関数の引数の型を取り出す

関数型の引数の位置に infer を書くと、第1引数の型だけを取り出せます。既存の関数に合わせて変数や別の関数の型を決めたいとき、引数の型を手書きでコピーせずに済みます。infer は「型のパターンマッチの捕獲変数」だという感覚がつかめる例です。

TypeScript

4オブジェクトの特定プロパティの型を取り出す

extends の右側のオブジェクト型の中にも infer を書けます。{ data: infer D } とすれば「data プロパティを持つ型なら、その型を D として捕まえる」という意味になります。どんな形のレスポンスでも data の中身だけ取り出す、API まわりで便利なパターンです。

TypeScript

5実務: 関数の戻り値の型を取り出して再利用する

戻り値の型に名前を付けていない関数から、infer で戻り値の型を取り出して他の関数で再利用する実務例です。createSession の戻り値の形を変えても Session 型は自動で追従します。これがないと戻り値と同じ形の型を手書きで定義して二重管理することになります。後のレッスンで学ぶ組み込みの ReturnType は、まさにこの実装です。

TypeScript