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