Skip to content
← Back to rules

eslint/no-fallthrough Pedantic

🚧 An auto-fix is planned for this rule, but not implemented at this time.

何をするか

case 文の落ち込み(fallthrough)を禁止します

このルールは、意図しない case の落ち込みを排除することを目的としています。そのため、コメントで明示されていない落込みのシナリオすべてを警告します。

なぜ問題なのか

JavaScript の switch 文は、「次の case に落ち込む」ことが可能なことから、言語の中で比較的ミスを起こしやすい構文の一つです。たとえば:

js
switch (foo) {
  case 1:
    doSomething();

  case 2:
    doSomethingElse();
}

この例では、foo1 の場合、実行は最初の case から次の case へと流れてしまい、両方の処理が実行されます。これを防ぐには break を使用します。以下がその例です:

js
switch (foo) {
  case 1:
    doSomething();
    break;

  case 2:
    doSomethingElse();
}

これは落込みを望んでいない場合に適切に動作しますが、もし落込みが意図的なものであれば、言語上その意図を示す方法がありません。ベストプラクティスとして、意図的な落込みであることを /(falls?\s?through)/i という正規表現に一致するコメントで明示することが推奨されていますが、それは指令文ではなく単なるコメントである必要があります:

js
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 に意図的に落ち込むべきであることが明確に示されています。

このルールに対して 不正な コードの例:

js
switch (foo) {
  case 1:
    doSomething();

  case 2:
    doSomething();
}

このルールに対して 正しい コードの例:

js
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 でこのルールを 有効化 するには、次のようにします:

json
{
  "rules": {
    "no-fallthrough": "error"
  }
}
bash
oxlint --deny no-fallthrough

参考文献