IT-Q

{ 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
お使いの版で挙動が違う場合があります。誤りに気づいたらこの解説を報告するから教えてください。