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 문의 연속 실행을 금지합니다

이 규칙은 하나의 케이스에서 다른 케이스로 의도치 않게 연속 실행되는 것을 제거하기 위한 것입니다. 따라서 주석으로 표시되지 않은 모든 연속 실행 시나리오를 경고합니다.

왜 좋지 않은가?

자바스크립트의 switch 문은 한 케이스에서 다음 케이스로 "연속 실행"할 수 있다는 특성 덕분에 언어에서 가장 실수하기 쉬운 구조 중 하나입니다. 예를 들어:

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

  case 2:
    doSomethingElse();
}

이 예제에서 foo1이라면, 첫 번째 케이스가 두 번째 케이스로 연속 실행되므로 둘 다 실행됩니다. 이를 방지하려면 break를 사용하면 됩니다. 예시:

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

  case 2:
    doSomethingElse();
}

의도하지 않은 연속 실행을 막는 데는 문제가 없지만, 만약 연속 실행이 의도적이라면 언어 자체에서는 이를 나타낼 방법이 없습니다. 따라서 의도적인 연속 실행을 주석을 통해 항상 표시하는 것이 최선의 실천 방법입니다. 이 주석은 /falls?\s?through/i 정규식과 일치해야 하지만 지시어(directive)는 아니어야 합니다:

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();
  }
}

이 예제에서는 예상 동작에 대해 혼란이 없습니다. 첫 번째 케이스가 두 번째 케이스로 의도적으로 연속 실행되어야 한다는 것이 명확합니다.

예시

이 규칙에 대한 잘못된 코드 예시:

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();
  }
}

이 예시들에서 마지막 케이스 문은 경고를 유발하지 않는다는 점에 유의하세요. 왜냐하면 더 이상 연속 실행될 대상이 없기 때문입니다.

구성

이 규칙은 다음 속성을 가진 구성 객체를 수용합니다:

allowEmptyCase

type: boolean

기본값: false

빈 케이스 문이 연속 실행되는 것을 허용할지 여부.

commentPattern

type: string

연속 실행 주석과 일치하도록 설정할 사용자 정의 정규 표현식 패턴.

reportUnusedFallthroughComment

type: boolean

기본값: false

의도적인 연속 실행을 표시한 주석이 실제로 사용되지 않았을 때 경고를 보고할지 여부.

사용 방법

구성 파일 또는 CLI를 사용하여 이 규칙을 활성화하려면 다음과 같이 사용할 수 있습니다:

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

참고 자료