【はんべつきょうようたい】
判別共用体 とは?
最終更新:
💡 名札の値で見分ける、複数の型の選択肢
タグで候補を見分けられる共用体。TypeScriptでは、共通プロパティに異なるリテラル値を持つ型をユニオンにし、その値を調べて型を絞り込める。
📌 このページのポイント
- TypeScriptでは共通のタグにcircleやsquareなどのリテラル型を使う
- タグをifやswitchで調べると、該当する候補へ型を絞り込める
- 候補ごとに必要なプロパティを定義し、タグとデータを対応させる
- neverへの代入で分岐の網羅性を検査できるが、外部入力の検証は別に必要
普通のユニオン型と何が違うの?
TypeScriptの例なら、各候補に共通のタグを持たせるんだ。Circleはtype: 'circle'とradius、Squareはtype: 'square'とsideを持つ型として定義し、Circle | Squareにする。タグは単なるstring型ではなく、それぞれのリテラル型にするよ。
タグがあると何がうれしいの?
shape.typeが'circle'かをifで調べると、その枝ではCircleに絞り込めてradiusを使えるんだ。switchでも同じように分岐できる。タグと必要なデータを候補ごとに対応させるのが大事だね。
全部の項目を省略可能にするのはだめ?
typeを'circle' | 'square'にしてradiusやsideを両方省略可能にするだけだと、circleでもradiusがあるとは分からないよ。Circleにはradiusを必須、Squareにはsideを必須とした別々の型を作ると、対応が型に表れるんだ。
候補を増やしたときの処理漏れは?
各caseでreturnするswitchのdefaultで、const check: never = shape;のように代入して検査できるよ。Triangleを追加してそのcaseを書かなければ、残ったTriangleをneverに代入できず型エラーになる。タグを付けるだけで自動的に全分岐が検査されるわけではないんだ。
APIの応答にも型を付ければ安全?
型注釈や型アサーションは、実行時にデータを検査しないよ。外部から届いた値には、タグや必須項目の検証が必要なんだ。検証して候補に合うと確かめた値を扱えば、判別共用体の絞り込みを活かせるね。
まとめ:ざっくりこれだけ覚えればOK!
「判別共用体」って出てきたら「タグの値で候補を見分けられる共用体」と思えばだいたいOK!
📖 おまけ:英語の意味
「Discriminated Union」 = 判別できる共用体
💬 Discriminated は「区別された」という意味で、タグで区別できるユニオンということだよ