Spec-Zone.ru › ESLint

no-fallthrough

Запрещает проваливание операторов case

✅ Рекомендуется

Использование конфигурации recommended из @eslint/js в файле конфигурации включает это правило

Оператор switch в JavaScript — одна из наиболее подверженных ошибкам конструкций языка, отчасти из-за возможности «проваливания» из одного case в следующий. Например:

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

    case 2:
        doSomethingElse();
}

В этом примере, если foo равно 1, выполнение пройдет через оба варианта, поскольку первый проваливается во второй. Этого можно избежать, используя 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();
    }
}

В этом примере ожидаемое поведение не вызывает сомнений. Очевидно, что первый вариант должен проваливаться во второй.

Подробности правила

Это правило предназначено для устранения непреднамеренного проваливания из одного варианта в другой. Поэтому оно отмечает все случаи проваливания, не помеченные комментарием.

Примеры неправильного кода для этого правила:

Открыть в Playground
/*eslint no-fallthrough: "error"*/

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

    case2:doSomething();
}

Примеры правильного кода для этого правила:

Открыть в Playground
/*eslint no-fallthrough: "error"*/

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 в этих примерах не вызывает предупреждения, поскольку далее некуда проваливаться.

Параметры

Это правило принимает объект параметров:

  • Задайте для параметра commentPattern строку с регулярным выражением, чтобы изменить проверку комментария о намеренном проваливании. Если комментарий о проваливании соответствует директиве, она имеет приоритет над commentPattern.

  • Задайте для параметра allowEmptyCase значение true, чтобы разрешить пустые варианты независимо от их расположения. По умолчанию это правило не требует комментария о проваливании после пустого case, только если пустой case и следующий case находятся на одной строке или на соседних строках.

  • Задайте для параметра reportUnusedFallthroughComment значение true, чтобы запретить комментарий о проваливании, если вариант не может провалиться из-за недостижимости. В основном это нужно для предотвращения вводящих в заблуждение комментариев, возникающих в результате рефакторинга.

commentPattern

Примеры правильного кода для параметра { "commentPattern": "break[\\s\\w]*omitted" }:

Открыть в Playground
/*eslint no-fallthrough: ["error", { "commentPattern": "break[\\s\\w]*omitted" }]*/

switch(foo) {
    case 1:
        doSomething();
        // break omitted

    case 2:
        doSomething();
}

switch(foo) {
    case 1:
        doSomething();
        // caution: break is omitted intentionally

    default:
        doSomething();
}

allowEmptyCase

Примеры правильного кода для параметра { "allowEmptyCase": true }:

Открыть в Playground
/* eslint no-fallthrough: ["error", { "allowEmptyCase": true }] */

switch(foo){
    case 1:

    case 2: doSomething();
}

switch(foo){
    case 1:
    /*
    Put a message here 
    */
    case 2: doSomething();
}

reportUnusedFallthroughComment

Примеры неправильного кода для параметра { "reportUnusedFallthroughComment": true }:

Открыть в Playground
/* eslint no-fallthrough: ["error", { "reportUnusedFallthroughComment": true }] */

switch(foo){
    case 1:
        doSomething();
        break;
    // falls through
    case 2: doSomething();
}

function f() {
    switch(foo){
        case 1:
            if (a) {
                throw new Error();
            } else if (b) {
                break;
            } else {
                return;
            }
        // falls through
        case 2:
            break;
    }
}

Примеры правильного кода для параметра { "reportUnusedFallthroughComment": true }:

Открыть в Playground
/* eslint no-fallthrough: ["error", { "reportUnusedFallthroughComment": true }] */

switch(foo){
    case 1:
        doSomething();
        break;
    // just a comment
    case 2: doSomething();
}

Когда не следует использовать правило

Если вы не хотите требовать, чтобы каждый оператор case заканчивался throw, return, break или комментарием, это правило можно отключить.

Связанные правила

  • default-case

Версия

Это правило появилось в ESLint v0.0.7.

Ресурсы

  • Исходный код правила
  • Исходный код тестов

© OpenJS Foundation and other contributors
Licensed under the MIT License.
https://eslint.org/docs/latest/rules/no-fallthrough

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API