【はんべつきょうようたい】

判別共用体 とは?

💡 名札をつけたユニオン型、switchひとつで型が確定
📌 このページのポイント
判別共用体(Discriminated Union) 共通の判別フィールド(タグ)で型を識別 Circle type: "circle" radius: number Square type: "square" side: number Triangle type: "triangle" base: number switch (shape.type) case "circle": → Circle型として安全に使える case "square": → Square型として安全に使える case "triangle": → Triangle型として安全に使える default: never → 網羅性チェック(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 は「区別された」という意味で、タグで区別できるユニオンということだよ
← 用語集にもどる