eslint/no-fallthrough Pedantic
何をするか
case 文の落ち込み(fallthrough)を禁止します
このルールは、意図しない case の落ち込みを排除することを目的としています。そのため、コメントで明示されていない落込みのシナリオすべてを警告します。
なぜ問題なのか
JavaScript の switch 文は、「次の case に落ち込む」ことが可能なことから、言語の中で比較的ミスを起こしやすい構文の一つです。たとえば:
switch (foo) {
case 1:
doSomething();
case 2:
doSomethingElse();
}この例では、foo が 1 の場合、実行は最初の case から次の case へと流れてしまい、両方の処理が実行されます。これを防ぐには break を使用します。以下がその例です:
switch (foo) {
case 1:
doSomething();
break;
case 2:
doSomethingElse();
}これは落込みを望んでいない場合に適切に動作しますが、もし落込みが意図的なものであれば、言語上その意図を示す方法がありません。ベストプラクティスとして、意図的な落込みであることを /(falls?\s?through)/i という正規表現に一致するコメントで明示することが推奨されていますが、それは指令文ではなく単なるコメントである必要があります:
switch (foo) {
case 1:
doSomething();
// falls through
case 2:
doSomethingElse();
}
switch (foo) {
case 1:
doSomething();
// fall through
case 2:
doSomethingElse();
}
switch (foo) {
case 1:
doSomething();
// fallsthrough
case 2:
doSomethingElse();
}
switch (foo) {
case 1: {
doSomething();
// falls through
}
case 2: {
doSomethingElse();
}
}この例では、期待される振る舞いについて曖昧さがありません。最初の case が二つ目の case に意図的に落ち込むべきであることが明確に示されています。
例
このルールに対して 不正な コードの例:
switch (foo) {
case 1:
doSomething();
case 2:
doSomething();
}このルールに対して 正しい コードの例:
switch (foo) {
case 1:
doSomething();
break;
case 2:
doSomething();
}
function bar(foo) {
switch (foo) {
case 1:
doSomething();
return;
case 2:
doSomething();
}
}
switch (foo) {
case 1:
doSomething();
throw new Error("Boo!");
case 2:
doSomething();
}
switch (foo) {
case 1:
case 2:
doSomething();
}
switch (foo) {
case 1:
case 2:
doSomething();
}
switch (foo) {
case 1:
doSomething();
// falls through
case 2:
doSomething();
}
switch (foo) {
case 1: {
doSomething();
// falls through
}
case 2: {
doSomethingElse();
}
}最後の case 文が警告を引き起こさないことに注意してください。それ以上落ち込む先がないためです。
設定
このルールは以下のプロパティを持つ設定オブジェクトを受け入れます。
allowEmptyCase
type: boolean
default: false
空の case クラウーズが落ち込むことを許可するかどうか。
commentPattern
type: string
落込みコメントと照合するカスタム正規表現パターン。
reportUnusedFallthroughComment
type: boolean
default: false
不要な落込みコメントを報告するかどうか。
使用方法
設定ファイルまたは CLI でこのルールを 有効化 するには、次のようにします:
{
"rules": {
"no-fallthrough": "error"
}
}oxlint --deny no-fallthrough