Spec-Zone.ru › ESLint

Без неявного перехода

Запретить неявный переход 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();
    }
}

В этом примере нет двусмысленности относительно ожидаемого поведения. Ясно, что первый случай должен перейти ко второму.

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

Это правило направлено на устранение непреднамеренных переходов от одного случая к другому. Таким образом, оно отмечает любые сценарии перехода, которые не помечены комментарием.

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

Открыть в игровой площадке
/*eslint no-fallthrough: "error"*/

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

    case2:doSomething();
}

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

Открыть в игровой площадке
/*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" }:

Открыть в игровой площадке
/*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 }:

Открыть в игровой площадке
/* 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 }:

Открыть в игровой площадке
/* 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 }:

Открыть в игровой площадке
/* 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