状態に "empty"(データが0件)を足しました。表示側で書き漏れを防ぐには、どうしておきますか。
default で、絞り込まれた値を never 型の変数に代入しておきます。状態を足して case を書き漏らすと、そこに値が残って代入がエラーになり、コンパイル時に気づけます。
面接官が見ているのはnever を使った網羅性チェックを使えるか。
これは「画面の状態が { isLoading: boolean; error?: string; data?: User } で管理されていました。何が問題ですか。」への追撃質問です。
よくある答えと、面談でどう見られるか
- switch の default で、絞り込まれた値を never 型の変数に代入しておく。書き漏れがあればコンパイルエラーになる
その通りです。新しい状態を足すと、扱っていない switch がすべてエラーになります。 - default で何もしないようにしておく
書き漏れても何も起きず、その状態だけ表示されない不具合になります。 - 状態を足すときに、使っている箇所を全文検索して直す
できますが、人の注意に頼っています。コンパイラに見つけさせる方が確実です。 - if 文で書けば自動で網羅される
if でも switch でも、何もしなければ書き漏れは検出されません。
模範解答
switch の default で、絞り込まれた値を never 型の変数に代入しておきます。
default: {
const unreachable: never = state
throw new Error("想定外の状態")
}すべての状態を case で扱っていれば、default に来る値は無いので state は never になり、代入は通ります。"empty" を足すと、default に "empty" が流れ込み、never に代入できずにコンパイルエラーになります。これで、扱いを書き漏れた switch をコンパイラが全部教えてくれます。
公式の Handbook も、この書き方を網羅性チェック(exhaustiveness checking)として紹介しています。
出典(一次資料)
対象: TypeScript 5.x〜7.0 照合した一次資料: 公式ドキュメント 照合: 2026-10-25 最終更新: 2026-10-25
お使いの版で挙動が違う場合があります。誤りに気づいたらこの解説を報告するから教えてください。
ここからどう深掘りされるか
この問いに答えられた場合、面談は次の質問に進みます。
観点をすべて押さえられた場合
網羅性チェックを入れているのに、本番で想定外の状態が来て画面が壊れました。なぜですか。