判別可能なユニオン(discriminated union)とは、どういう型ですか。
各メンバーが同じ名前のプロパティを持ち、その値がメンバーごとに違うユニオン型です。その値で分岐すると、TypeScript が分岐の中で型を絞り込みます。
面接官が見ているのは補強。共通のリテラル型のプロパティで分岐できる型だと知っているか。
これは「画面の状態が { isLoading: boolean; error?: string; data?: User } で管理されていました。何が問題ですか。」への追撃質問です。
よくある答えと、面談でどう見られるか
- 各メンバーが同じ名前のプロパティを持ち、その値がリテラル型で異なるユニオン。その値で分岐すると型が絞り込まれる
その通りです。status や kind のようなプロパティを手がかりに分けます。 - 実行時に型を判別してくれるユニオン
判別するのは自分で書く分岐です。TypeScript はその分岐を読んで型を絞り込みます。 - クラスを継承して作るユニオン
クラスは要りません。ただのオブジェクトの型で作れます。 - enum のこと
別物です。判別に使うプロパティの値として enum を使うことはできますが、同じものではありません。
模範解答
各メンバーが同じ名前のプロパティ(status や kind など)を持ち、その値がメンバーごとに異なるリテラル型になっているユニオンです。
そのプロパティの値で分岐すると、TypeScript はその分岐の中で型を絞り込みます。status === "success" の中では data がある型として扱われ、status === "error" の中では error がある型として扱われます。
ありえない状態の組み合わせを型として書けなくするのに使います。
出典(一次資料)
対象: TypeScript 5.x〜7.0 照合した一次資料: 公式ドキュメント 照合: 2026-10-25 最終更新: 2026-10-25
お使いの版で挙動が違う場合があります。誤りに気づいたらこの解説を報告するから教えてください。