Без неявного перехода
Запретить неявный переход 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();
}
Примеры правильного кода для этого правила:
/*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;
case 2: doSomething();
}
function f() {
switch(foo){
case 1:
if (a) {
throw new Error();
} else if (b) {
break;
} else {
return;
}
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 или комментарием, то вы можете безопасно отключить это правило.
Связанные правила
Версия
Это правило было добавлено в ESLint v0.0.7.
Ресурсы
© OpenJS Foundation and other contributors
Licensed under the MIT License.
https://eslint.org/docs/latest/rules/no-fallthrough