【はんべつきょうようたい】
判別共用体 とは?
💡 名札をつけたユニオン型、switchひとつで型が確定
📌 このページのポイント
- 各型に共通の判別フィールド(タグ)を持たせることで、型を一意に識別できる
- switch文でタグを分岐するだけで、各caseの中では具体的な型として扱える
- TypeScriptやRustのenum、F#のDUなど多くの言語で採用されている設計パターン
- 網羅性チェックと組み合わせることで、caseの追加漏れをコンパイル時に検出できる
判別共用体って普通のユニオン型と何が違うの?
普通のユニオン型は string | number みたいにただ並べるだけだけど、判別共用体は各型に共通のタグフィールドがあるんだ。たとえば type: 'circle' や type: 'square' みたいなフィールドで見分けられるよ
タグがあると何がうれしいの?
switch(shape.type) と書くだけで、case 'circle' の中では自動的にCircle型として扱えるんだ。プロパティへのアクセスも型安全になるよ
新しい型を追加したときに漏れが心配だなあ…
そこが判別共用体の真骨頂だよ。defaultケースで never型にアサインすると、処理し忘れた型があればコンパイルエラーになる。網羅性チェックって呼ばれるテクニックだね
TypeScript以外でも使えるの?
Rustのenumはまさに判別共用体そのものだし、F#やHaskellにもある。関数型プログラミングでは代数的データ型って呼ばれていて、パターンマッチと組み合わせるのが定石だよ
まとめ:ざっくりこれだけ覚えればOK!
「判別共用体」って出てきたら「タグ付きで見分けがつくユニオン型」と思えればだいたいOK!
📖 おまけ:英語の意味
「Discriminated Union」 = 判別できる共用体
💬 Discriminated は「区別された」という意味で、タグで区別できるユニオンということだよ