▪️

noFallthroughCasesInSwitchを指定してfallthroughを検出する

に公開

はじめに

switch文に break を書き忘れると、意図しないフォールスルーが発生する。

TypeScriptでは、noFallthroughCasesInSwitchオプションを有効にすることで、
静的解析の段階でこのミスを検知できる。

本記事では、このオプションの有無による挙動の違いを解説する。

noFallthroughCasesInSwitch

noFallthroughCasesInSwitchはswitch文のfallthroughを禁止するコンパイラオプションです。

https://typescriptbook.jp/reference/tsconfig/nofallthroughcasesinswitch

fallthroughとは何か

switch文で case の末尾に break を書かない場合、処理はそのまま次の case に流れる。
この挙動をfallthrough(フォールスルー)と呼ぶ。

noFallthroughCasesInSwitchが無効

tsconfig.jsonのnoFallthroughCasesInSwitchを指定していない場合、
fallthroughは検知されない。

const value = 1;

switch (value) {
  case 1:
    console.log("one");
  case 2:
    console.log("two");
}

このコードを実行すると、次のように出力される:

one
two

break がないため、case 2 まで実行されてしまう。

noFallthroughCasesInSwitchが有効

tsconfig.jsonに noFallthroughCasesInSwitch: true を指定する:

{
  "compilerOptions": {
    "noFallthroughCasesInSwitch": true
  }
}

以下のコードは静的解析でエラーとなる:

const value = 1;

switch (value) {
  case 1:
    console.log("one");
  case 2:
    console.log("two");
    break;
}

出力されるエラー:

error TS7029: Fallthrough case in switch.

case 1break がないため、意図しないfallthroughがあると判定される。

おわりに

noFallthroughCasesInSwitchを有効にすることで、
switch文での意図しないfallthroughを静的解析で防ぐことができる。

Discussion