{ kind: "circle"; radius: number } と { kind: "square"; size: number } のユニオン型を扱うとき、何を手がかりに分岐しますか。
共通のプロパティ(kind など)の値で switch すると、各 case の中で型が絞り込まれます。default で never に代入しておけば、メンバーを足したときの書き漏れがエラーになります。
面接官が見ているのは判別可能なユニオン(discriminated union)を知っているか。
よくある答えと、面談でどう見られるか
- 共通のプロパティ kind の値で switch する
判別可能なユニオンです。case "circle" の中では radius が使えるようになります。 - "radius" in shape で確かめる
動きますし絞り込まれます。ただ、共通の kind があるならそれで分ける方が素直で、網羅の検査もしやすくなります。 - shape as { kind: "circle"; radius: number } と書いて使う
確かめずに断言しています。四角形が来ても検査を通ってしまいます。 - instanceof で判定する
これらはクラスではなくただのオブジェクトの型なので、instanceof では区別できません。
模範解答
共通のプロパティ(ここでは kind)の値で分岐します。各メンバーがリテラル型の同じプロパティを持つユニオンを、判別可能なユニオンと呼びます。
switch (shape.kind) {
case "circle": return Math.PI * shape.radius ** 2
case "square": return shape.size ** 2
}case "circle" の中では、shape は円の型に絞り込まれ、radius が使えます。
さらに default で never 型の変数に代入しておくと、あとでユニオンに三角形を足したときに、処理を書き忘れた switch がコンパイルエラーになります。これを網羅性チェックと呼びます。
対象: TypeScript 5.x〜7.0 照合した一次資料: 公式ドキュメント 照合: 2026-10-25 最終更新: 2026-10-25
お使いの版で挙動が違う場合があります。誤りに気づいたらこの解説を報告するから教えてください。