IT-Q

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

ここからどう深掘りされるか

この問いに答えられた場合、面談は次の質問に進みます。