semi
Требовать или запрещать точки с запятой вместо ASI
Некоторые проблемы, обнаруженные этой настройкой, автоматически исправляются с помощью параметра --fix командной строки
Эта настройка была устарела в ESLint v8.53.0. Используйте соответствующую настройку правило в @stylistic/eslint-plugin-js.
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