🔀
判別ユニオン — TypeScriptでenumの代わりに使うパターン
typeフィールドで分岐するとTypeScriptが各分岐の型を自動的に絞る
shape.kindで分岐するとTypeScriptが各case内でshapeの型を自動絞り込み。
なぜenumの代わりに使うか
enumはランタイムにコードが生成される(逆方向マッピングオブジェクト)。判別ユニオンは型レベルでのみ存在しランタイムコストゼロ。
exhaustiveチェック
never型で全ケースを処理したかコンパイル時に検証。Rustのexhaustive matchと同じ効果。
キーポイント
1
ユニオンの各型に共通リテラルフィールド(kind、type等)を置く=discriminant
2
switch/ifでdiscriminantを分岐するとTypeScriptが自動型絞り込み
3
never型でexhaustiveチェック — ケース漏れ時コンパイルエラー
4
enumよりランタイムコストゼロ+型安全性同等(またはそれ以上)
ユースケース
Redux action — { type: "INCREMENT" } | { type: "SET_VALUE", payload: number }
APIレスポンス — { status: "success", data: T } | { status: "error", message: string }