サンプルコードで身につける: Exclude / Extract / NonNullable
解説で学んだ概念を、5つの具体例で確認します。素朴な例から実務寄りの例へと進みます。
1Exclude でユニオンから候補を取り除く
Exclude の最も素朴な形です。果物のユニオンから "melon" を取り除いた新しいユニオンを作ります。元の Fruit 型は一切変わらず、取り除いた候補を代入しようとするとエラーになることを確かめましょう。
2Extract で当てはまる候補だけを残す
Extract は Exclude の逆で、第2引数に当てはまる候補だけを残します。string | number | boolean | null のような雑多なユニオンから「文字列と数値だけ」を絞り出せます。「いらないものを消す」Exclude と「ほしいものを残す」Extract、どちらで書くと意図が伝わるかで使い分けます。
3NonNullable で null と undefined を消す
NonNullable<T> はユニオンから null と undefined だけを取り除きます。「未入力かもしれない値」の型から「確定後の値」の型を導出するのが典型です。typeof と組み合わせれば、既存の変数の型から null 抜きの型を作ることもできます。
4Extract で判別可能ユニオンから1種類を取り出す
Extract の第2引数には { kind: "circle" } のような形も書けます。判別可能ユニオンから特定のメンバーの型だけを取り出せるので、「円だけを扱う関数」の引数型を手書きせずに導出できます。ユニオンのメンバーに型の名前を付けていなくても後から取り出せるのが便利な点です。
5実務: 注文ステータスから操作可能な状態を導出する
注文ステータスの全候補から「キャンセル操作ができる状態」を Exclude で導出する実務例です。元のユニオンに "refunded" のような状態を追加しても、派生型は自動で追従します。これがないと "draft" | "pending" | "paid" という部分ユニオンを手書きして元の型と二重管理することになり、状態の追加時に修正漏れが起きます。