IT-Q

網羅性チェックを入れているのに、本番で想定外の状態が来て画面が壊れました。なぜですか。

網羅性チェックはコンパイル時の検査で、API から型に無い値が来ることは防げないからです。default で例外を投げるか、安全な表示に落とすようにして、壊れ方を制御します。

面接官が見ているのはnever の検査はコンパイル時のもので、外から来る値は保証しないと分かるか。

これは「状態に "empty"(データが0件)を足しました。表示側で書き漏れを防ぐには、どうしておきますか。」への追撃質問です。

よくある答えと、面談でどう見られるか

  • 網羅性チェックはコンパイル時の検査で、API から型に無い値が来ることまでは防げない。境界で値を確かめる
    その通りです。default の throw が実行時の最後の砦になり、根本は境界での検査です。
  • 網羅性チェックの書き方が間違っていた
    書き方が正しくても起きます。コンパイル時に知りうるのは、型として書かれた状態だけです。
  • never 型の変数に代入すると、実行時に例外が投げられるはずだった
    型は実行時に消えるので、代入しただけでは何も起きません。default で自分で throw する必要があります。
  • TypeScript のバグ
    バグではありません。型は実行時の値を保証しません。

模範解答

網羅性チェックはコンパイル時の検査だからです。型として書かれた状態はすべて扱っていると保証できますが、実行時に API から型に無い値(たとえば新しく追加された "archived")が来ることは防げません。

型の上で never になっている default にも、実行時には想定外の値が届きます。never 型の変数に代入しただけでは、型が消えた実行時には何も起きません。default で明示的に例外を投げるか、安全な表示に落とすようにしておくと、壊れ方を制御できます。

根本の対策は、API の応答を受け取った境界で、status が想定した値のどれかであることを確かめることです。面談では「型で網羅した」と「実行時に網羅できている」を区別できるかを見られます。

対象: TypeScript 5.x〜7.0 照合した一次資料: 公式ドキュメント 照合: 2026-10-25 最終更新: 2026-10-25
お使いの版で挙動が違う場合があります。誤りに気づいたらこの解説を報告するから教えてください。