no-unused-expressions
Запрет на неиспользуемые выражения
Неиспользуемое выражение, не оказывающее никакого влияния на состояние программы, указывает на логическую ошибку.
Например, n + 1; не является синтаксической ошибкой, но может быть опечаткой, где программист имел в виду оператор присваивания n += 1; . Иногда такие неиспользуемые выражения могут быть устранены некоторыми инструментами сборки в производственной среде, что может привести к нарушению логики приложения.
Подробности правила
Это правило направлено на устранение неиспользуемых выражений, не влияющих на состояние программы.
Это правило не применяется к вызовам функций или конструкторов с оператором new, поскольку они могут иметь побочные эффекты на состояние программы.
var i = 0;
function increment() { i += 1; }
increment(); // return value is unused, but i changed as a side effect
var nThings = 0;
function Thing() { nThings += 1; }
new Thing(); // constructed object is unused, but nThings changed as a side effect
Это правило не применяется к директивам (которые имеют вид строковых литеральных выражений, таких как "use strict"; в начале скрипта, модуля или функции).
Последовательности выражений (использующие запятую, например a = 1, b = 2) всегда считаются неиспользуемыми, если их возвращаемое значение не присваивается или не используется в проверке условия, или если не выполняется вызов функции со значением последовательности.
Параметры
Это правило по умолчанию не требует никаких аргументов. Если вы хотите включить один или несколько из следующих параметров, вы можете передать объект с указанными параметрами:
-
allowShortCircuitустановленное вtrueпозволит вам использовать сокращенные вычисления в ваших выражениях (По умолчанию:false). -
allowTernaryустановленное вtrueпозволит вам использовать условные операторы в ваших выражениях аналогично сокращенным вычислениям (По умолчанию:false). -
allowTaggedTemplatesустановленное вtrueпозволит вам использовать помеченные шаблонные литералы в ваших выражениях (По умолчанию:false). -
enforceForJSXустановленное вtrueбудет отмечать неиспользуемые выражения элементов JSX (По умолчанию:false).
Эти параметры позволяют использовать неиспользуемые выражения только если все пути кода либо напрямую изменяют состояние (например, оператор присваивания), либо могут иметь побочные эффекты (например, вызов функции).
Примеры некорректного кода для параметров по умолчанию { "allowShortCircuit": false, "allowTernary": false }:
/*eslint no-unused-expressions: "error"*/
if(0)
{}
Примеры корректного кода для параметров по умолчанию { "allowShortCircuit": false, "allowTernary": false }:
/*eslint no-unused-expressions: "error"*/
{} // In this context, this is a block statement, not an object literal
{ myLabel: foo() } // In this context, this is a block statement with a label and expression, not an object literal
function namedFunctionDeclaration () {}
(function aGenuineIIFE () {}());
f()
a = 0
new C
delete a.b
void a
Обратите внимание, что одно или несколько строковых выражений (с или без точек с запятой) будут считаться неиспользуемыми только если они не находятся в начале скрипта, модуля или функции (в одиночку и не прерываются другими операторами). В противном случае они будут рассматриваться как часть «преамбулы директив», раздела, потенциально пригодного для использования движками JavaScript. Это включает директивы «строгого режима».
Примеры корректного кода для этого правила в отношении директив:
/*eslint no-unused-expressions: "error"*/
"use strict";
"use asm"
"use stricter";
"use babel"
"any other strings like this in the directive prologue";
"this is still the directive prologue";
function foo() {
"bar";
}
class Foo {
someMethod() {
"use strict";
}
}
Примеры некорректного кода для этого правила в отношении директив:
/*eslint no-unused-expressions: "error"*/
doSomething();
// this isn't in a directive prologue, because there is a non-directive statement before it
function foo() {
}
class Foo {
static {
// class static blocks do not have directive prologues
}
}
allowShortCircuit
Примеры некорректного кода для параметра { "allowShortCircuit": true }:
/*eslint no-unused-expressions: ["error", { "allowShortCircuit": true }]*/
Примеры корректного кода для параметра { "allowShortCircuit": true }:
/*eslint no-unused-expressions: ["error", { "allowShortCircuit": true }]*/
a && b()
a() || (b = c)
allowTernary
Примеры некорректного кода для параметра { "allowTernary": true }:
/*eslint no-unused-expressions: ["error", { "allowTernary": true }]*/
Примеры корректного кода для параметра { "allowTernary": true }:
/*eslint no-unused-expressions: ["error", { "allowTernary": true }]*/
a ? b() : c()
a ? (b = c) : d()
allowShortCircuit и allowTernary
Примеры корректного кода для параметров { "allowShortCircuit": true, "allowTernary": true }:
/*eslint no-unused-expressions: ["error", { "allowShortCircuit": true, "allowTernary": true }]*/
a ? b() || (c = d) : e()
allowTaggedTemplates
Примеры некорректного кода для параметра { "allowTaggedTemplates": true }:
/*eslint no-unused-expressions: ["error", { "allowTaggedTemplates": true }]*/
Примеры корректного кода для параметра { "allowTaggedTemplates": true }:
/*eslint no-unused-expressions: ["error", { "allowTaggedTemplates": true }]*/
tag`some tagged template string`;
enforceForJSX
JSX чаще всего используется в экосистеме React, где он компилируется в React.createElement выражения. Несмотря на отсутствие побочных эффектов, эти вызовы не отмечаются автоматически правилом no-unused-expression. Если вы используете React или любой другой прагматический JSX, свободный от побочных эффектов, этот параметр можно включить, чтобы отметить эти выражения.
Примеры некорректного кода для параметра { "enforceForJSX": true }:
/*eslint no-unused-expressions: ["error", { "enforceForJSX": true }]*/
Примеры корректного кода для параметра { "enforceForJSX": true }:
/*eslint no-unused-expressions: ["error", { "enforceForJSX": true }]*/
var myComponentPartial = <MyComponent />;
var myFragment = <></>;
Версия
Это правило было введено в ESLint v0.1.0.
Ресурсы
© OpenJS Foundation and other contributors
Licensed under the MIT License.
https://eslint.org/docs/latest/rules/no-unused-expressions