🔀

判別ユニオン — 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 }