概要
https://www.typescriptlang.org/tsconfig#noFallthroughCasesInSwitch
{
"noFallthroughCasesInSwitch": true
}
fallthrough というのは switch
文の case
内で break
が無い場合に、その下の case
の処理も実行される仕様のことです。
JS では fallthrough が発生するので、break
を書かないとどんどん下の case
文が実行されていきます。
これオプション名からわかりにくいんですが、fallthrough な case
のうち、1 行以上処理が存在しているにも関わらず脱出処理(break
や return
)が無いものにエラーを吐きます。
とりあえずtrue
にしておきましょう。
詳細
上で太字にした部分を説明します。
Ruby を書いていると case
文(JS で言う switch
文のこと)の中で when
句(JS で言う case
のこと)に複数の値を指定できるのが結構便利だったりします。JS では case
文に複数の値を指定できないので、そういう時は switch
文の fallthrough を利用したくなります。
// "noFallthroughCasesInSwitch": true
const func = (hoge: string) => {
switch (hoge) {
case "HOGE":
case "HOGE!!!":
case "HOGE??":
case "HOGE~~~~":
return "This is HOGE!!!";
case "piyo":
case "PIYO":
case "PIYO!!!":
return "This is PIYO!!!";
}
};
この書き方は JS 的にはなんら問題なく動きますし、"noFallthroughCasesInSwitch": true
であっても ts のコンパイルも通ります。
この例の場合、複数条件指定のつもりで書いている fallthrough な case
には処理が 1 行もありません。
ので、上で太字にした「1 行以上処理が存在しているのに脱出処理が無い」という条件に当てはまりません。
逆に、下記のコードはコンパイルエラーです。
// "noFallthroughCasesInSwitch": true
const func = (hoge: string) => {
let result;
switch (hoge) {
case "HOGE":
case "HOGE!!!":
console.log("HOGE!!"); // 1行以上の処理があるのにbreakもreturnも無いのでエラー
case "HOGE??":
case "HOGE~~~~":
return "This is HOGE!!!";
case "piyo":
case "PIYO":
result = "PIYO"; // 1行以上の処理があるのにbreakもreturnも無いのでエラー
case "PIYO!!!":
return "This is PIYO!!!";
}
return result;
};
index.ts:7:5 - error TS7029: Fallthrough case in switch.
7 case "HOGE!!!":
~~~~~~~~~~~~~~~
index.ts:13:5 - error TS7029: Fallthrough case in switch.
13 case "PIYO":
~~~~~~~~~~~~
Found 2 errors.
fallthrough は嫌いな人も多いわけですが、「複数の条件を指定したい場合」に限って言えば許されるようです。
個人的にも、fallthrough を複数条件指定以外で使う蓋然性が高いコードというのは見たことが無いので、このオプションは true
で良いと思います。