Dev Study
← 解説「条件型 — T extends U ? X : Y」に戻る

サンプルコードで身につける: 条件型 — T extends U ? X : Y

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

1型で分岐する最初の一歩

条件型の最も素朴な形です。T extends string が成り立てば "text"、成り立たなければ "not-text" という型に決まります。値の三項演算子とそっくりですが、判定されるのは値ではなく型で、すべてコンパイル時に解決されます。

TypeScript

2オブジェクトの形で判定する

extends の右側にはオブジェクト型も書けます。「id: number を持っているか?」のように形で判定できるのがポイントで、継承関係ではなく代入可能かどうかで決まります。プロパティが多い型でも、必要な形を満たしてさえいれば true 側に分岐します。

TypeScript

3条件型を連ねて多分岐にする

条件型の false 側にさらに条件型を書くと、if-else if のような多分岐が作れます。型ごとに表示ラベルを割り当てるような「型から型への対応表」が1つの型定義で書けます。ライブラリの型定義で長く連なった条件型を読むときも、この形が基本です。

TypeScript

4ユニオンは1候補ずつ分配される

条件型にユニオン型を渡すと、候補1つずつに条件が適用され、結果が再びユニオンにまとめられます。ToArray<string | number> が「string[] | number[]」になるのはこの分配のおかげです。後で学ぶ Exclude などのユーティリティ型もこの挙動を利用しています。

TypeScript

5実務: kind に応じて value の型が決まるフォーム項目

フォーム項目の kind が "checkbox" なら value は boolean、"text" なら string、という対応を条件型で1箇所に定義する実務例です。kind と value の食い違いはコンパイルエラーになります。条件型がないと CheckboxField と TextField を別々に手書きして二重管理することになり、項目の種類が増えるたびに型定義が増殖します。

TypeScript