no-unsafe-optional-chaining
Запретить использование необязательной цепочки в контекстах, где значение undefined недопустимо
Использование конфигурации recommended из @eslint/js в файле конфигурации включает это правило
Выражение необязательной цепочки (?.) может прерываться с возвращаемым значением undefined. Поэтому обработка вычисленного выражения необязательной цепочки как функции, объекта, числа и т. д. может привести к ошибке TypeError или непредсказуемым результатам. Например:
var obj = undefined;
1 in obj?.foo; // TypeError
with (obj?.foo); // TypeError
for (bar of obj?.foo); // TypeError
bar instanceof obj?.foo; // TypeError
const { bar } = obj?.foo; // TypeError
Также скобки ограничивают область прерывания в цепочках. Например:
var obj = undefined;
(obj?.foo)(); // TypeError
(obj?.foo).bar; // TypeError
Подробное описание правила
Это правило предназначено для обнаружения некоторых случаев, когда использование необязательной цепочки не предотвращает ошибки во время выполнения. В частности, оно помечает выражения необязательной цепочки в позициях, где прерывание до undefined приводит к сбросу TypeError после этого.
Примеры неправильного кода для этого правила:
/*eslint no-unsafe-optional-chaining: "error"*/
()();
().bar;
().bar;
().bar();
(obj?.foo ?? )();
(foo || )();
( && foo)();
(foo ? : bar)();
(foo, ).baz;
()`template`;
new ()();
[...];
bar(...);
1 in ;
bar instanceof ;
for (bar of );
const { bar } = ;
[{ bar } = ] = [];
with ();
class A extends {}
var a = class A extends {};
async function foo () {
const { bar } = await ;
(await )();
(await ).bar;
}
Примеры правильного кода для этого правила:
/*eslint no-unsafe-optional-chaining: "error"*/
(obj?.foo)?.();
obj?.foo();
(obj?.foo ?? bar)();
obj?.foo.bar;
obj.foo?.bar;
foo?.()?.bar;
(obj?.foo ?? bar)`template`;
new (obj?.foo ?? bar)();
var baz = {...obj?.foo};
const { bar } = obj?.foo || baz;
async function foo () {
const { bar } = await obj?.foo || baz;
(await obj?.foo)?.();
(await obj?.foo)?.bar;
}
Опции
Это правило имеет опцию объекта:
-
disallowArithmeticOperators: Запретить арифметические операции над выражениями необязательной цепочки (по умолчаниюfalse). Если этоtrue, это правило предупреждает об арифметических операциях с выражениями необязательной цепочки, которые, возможно, приведут кNaN.
disallowArithmeticOperators
При установке этой опции в true правило применяется к:
- Унарные операторы:
-,+ - Арифметические операторы:
+,-,/,*,%,** - Операторы присваивания:
+=,-=,/=,*=,%=,**=
Примеры дополнительного неправильного кода для этого правила с опцией { "disallowArithmeticOperators": true }.
/*eslint no-unsafe-optional-chaining: ["error", { "disallowArithmeticOperators": true }]*/
+;
-;
+ bar;
- bar;
/ bar;
* bar;
% bar;
** bar;
baz += ;
baz -= ;
baz /= ;
baz *= ;
baz %= ;
baz **= ;
async function foo () {
+await ;
await + bar;
baz += await ;
}
Версия
Это правило было добавлено в ESLint v7.15.0.
Ресурсы
© OpenJS Foundation and other contributors
Licensed under the MIT License.
https://eslint.org/docs/latest/rules/no-unsafe-optional-chaining