semi
Требовать или запрещать точки с запятой вместо ASI
Некоторые проблемы, о которых сообщает это правило, можно автоматически исправить с помощью параметра --fix командной строки
Это правило было устаревшим в ESLint v8.53.0. Оно будет удалено в v11.0.0. Используйте соответствующее правило из @stylistic/eslint-plugin.
JavaScript не требует точек с запятой в конце каждого оператора. Во многих случаях движок JavaScript может определить, где должна стоять точка с запятой, и автоматически добавить её. Эта возможность известна как автоматическая вставка точек с запятой (ASI) и считается одной из наиболее спорных особенностей JavaScript. Например, следующие строки допустимы:
var name = "ESLint"
var website = "eslint.org";
В первой строке движок JavaScript автоматически вставит точку с запятой, поэтому она не считается синтаксической ошибкой. Движок JavaScript всё равно знает, как интерпретировать эту строку, и понимает, что её конец указывает на конец оператора.
В спорах об ASI обычно выделяют две точки зрения. Согласно первой, следует вести себя так, как будто ASI не существует, и всегда вручную ставить точки с запятой. Аргумент заключается в том, что всегда ставить точки с запятой проще, чем помнить, когда они нужны, а когда нет, и это снижает вероятность ошибки.
Однако механизм ASI иногда может сбивать с толку тех, кто использует точки с запятой. Например, рассмотрим этот код:
return
{
name: "ESLint"
};
Это может выглядеть как оператор return, возвращающий литерал объекта, однако движок JavaScript интерпретирует этот код так:
return;
{
name: "ESLint";
}
Фактически точка с запятой вставляется после оператора return, из-за чего следующий за ним код (литерал с меткой внутри блока) становится недостижимым. Это правило и правило no-unreachable защитят ваш код от подобных случаев.
С другой стороны спора находятся те, кто считает, что раз точки с запятой вставляются автоматически, они необязательны и их не нужно ставить вручную. Однако механизм ASI также может сбивать с толку тех, кто не использует точки с запятой. Например, рассмотрим этот код:
var globalCounter = { }
(function () {
var n = 0
globalCounter.increment = function () {
return ++n
}
})()
В этом примере точка с запятой не будет вставлена после первой строки, что приведёт к ошибке во время выполнения (поскольку пустой объект вызывается как функция). Правило no-unexpected-multiline защитит ваш код от подобных случаев.
Хотя ASI предоставляет больше свободы в выборе стиля кодирования, она также может привести к неожиданному поведению кода — независимо от того, используете вы точки с запятой или нет. Поэтому лучше знать, когда срабатывает ASI, а когда нет, и позволить ESLint защитить ваш код от потенциально неожиданных ситуаций. Короче говоря, как однажды описал Айзек Шлютер, символ \n всегда завершает оператор (как и точка с запятой), если не выполняется одно из следующих условий:
- Оператор содержит незакрытую круглую скобку, литерал массива или литерал объекта либо заканчивается иным образом, который не является допустимым завершением оператора. (Например, заканчивается на
.или,.) - Строка начинается с
--или++(в этом случае следующий токен будет уменьшен/увеличен). - Это
for(),while(),do,if()илиelse, и отсутствует{ - Следующая строка начинается с
[,(,+,*,/,-,,,.или другого бинарного оператора, который может находиться только между двумя токенами одного выражения.
Подробности правила
Это правило обеспечивает последовательное использование точек с запятой.
Параметры
У этого правила есть два параметра: строковый и объектный.
Строковый параметр:
-
"always"(по умолчанию) требует ставить точки с запятой в конце операторов -
"never"запрещает ставить точки с запятой в конце операторов (кроме случаев, когда они нужны для устранения неоднозначности операторов, начинающихся с[,(,/,+или-)
Объектный параметр (при значении "always"):
-
"omitLastInOneLineBlock": trueзапрещает последнюю точку с запятой в блоке, если его фигурные скобки (а значит, и содержимое блока) находятся в одной строке -
"omitLastInOneLineClassBody": trueзапрещает последнюю точку с запятой в теле класса, если его фигурные скобки (а значит, и содержимое тела класса) находятся в одной строке
Объектный параметр (при значении "never"):
-
"beforeStatementContinuationChars": "any"(по умолчанию) игнорирует наличие или отсутствие точек с запятой в конце операторов, если следующая строка начинается с[,(,/,+или-. -
"beforeStatementContinuationChars": "always"требует ставить точки с запятой в конце операторов, если следующая строка начинается с[,(,/,+или-. -
"beforeStatementContinuationChars": "never"запрещает ставить точки с запятой в конце операторов, если это не создаёт опасности ASI, даже если следующая строка начинается с[,(,/,+или-.
Примечание: beforeStatementContinuationChars не применяется к полям класса, поскольку поля класса не являются операторами.
always
Примеры неправильного кода для этого правила с параметром "always" по умолчанию:
/*eslint semi: ["error", "always"]*/
var name = "ESLint"
object.method = function() {
// ...
}
class Foo {
bar = 1}
Примеры правильного кода для этого правила с параметром "always" по умолчанию:
/*eslint semi: "error"*/
var name = "ESLint";
object.method = function() {
// ...
};
class Foo {
bar = 1;
}
omitLastInOneLineBlock
Примеры дополнительного правильного кода для этого правила с параметрами "always", { "omitLastInOneLineBlock": true }:
/*eslint semi: ["error", "always", { "omitLastInOneLineBlock": true}] */
if (foo) { bar() }
if (foo) { bar(); baz() }
function f() { bar(); baz() }
class C {
foo() { bar(); baz() }
static { bar(); baz() }
}
omitLastInOneLineClassBody
Примеры дополнительного правильного кода для этого правила с параметрами "always", { "omitLastInOneLineClassBody": true }:
/*eslint semi: ["error", "always", { "omitLastInOneLineClassBody": true}] */
export class SomeClass{
logType(){
console.log(this.type);
console.log(this.anotherType);
}
}
export class Variant1 extends SomeClass{type=1}
export class Variant2 extends SomeClass{type=2; anotherType=3}
never
Примеры неправильного кода для этого правила с параметром "never":
/*eslint semi: ["error", "never"]*/
var name = "ESLint"
object.method = function() {
// ...
}
class Foo {
bar = 1
}
Примеры правильного кода для этого правила с параметром "never":
/*eslint semi: ["error", "never"]*/
var name = "ESLint"
object.method = function() {
// ...
}
var name = "ESLint"
;(function() {
// ...
})()
import a from "a"
(function() {
// ...
})()
import b from "b"
;(function() {
// ...
})()
class Foo {
bar = 1
}
beforeStatementContinuationChars
Примеры дополнительного неправильного кода для этого правила с параметрами "never", { "beforeStatementContinuationChars": "always" }:
/*eslint semi: ["error", "never", { "beforeStatementContinuationChars": "always"}] */
import a from "a"
(function() {
// ...
})()
Примеры дополнительного неправильного кода для этого правила с параметрами "never", { "beforeStatementContinuationChars": "never" }:
/*eslint semi: ["error", "never", { "beforeStatementContinuationChars": "never"}] */
import a from "a"
(function() {
// ...
})()
Когда не следует использовать
Если вы не хотите задавать определённые требования к использованию (или опущению) точек с запятой, отключите это правило.
Связанные правила
Версия
Это правило появилось в ESLint v0.0.6.
Дополнительная литература
Ресурсы
© OpenJS Foundation and other contributors
Licensed under the MIT License.
https://eslint.org/docs/latest/rules/semi