no-unsafe-optional-chaining
Запрещает использовать optional chaining в контекстах, где значение undefined недопустимо
Использование конфигурации recommended из @eslint/js в файле конфигурации включает это правило
Выражение optional chaining (?.) может завершиться досрочно со значением undefined. Поэтому использование результата вычисления выражения optional chaining в качестве функции, объекта, числа и т. д. может привести к TypeError или неожиданным результатам. Например:
const 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
Кроме того, скобки ограничивают область действия досрочного завершения в цепочках. Например:
const obj = undefined;
(obj?.foo)(); // TypeError
(obj?.foo).bar; // TypeError
Подробное описание правила
Это правило предназначено для обнаружения некоторых случаев, в которых использование optional chaining не предотвращает ошибки во время выполнения. В частности, оно отмечает выражения optional chaining в позициях, где досрочное завершение со значением 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 {}
const 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)();
const 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: запрещает арифметические операции над выражениями optional chaining (по умолчаниюfalse). Если этот параметр имеет значениеtrue, правило предупреждает об арифметических операциях над выражениями optional chaining, которые могут привести к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