Spec-Zone.ru › ESLint

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.

Примеры неправильного кода для этого правила:

Открыть в Playground
/*eslint no-unsafe-optional-chaining: "error"*/

(obj?.foo)();

(obj?.foo).bar;

(foo?.()).bar;

(foo?.()).bar();

(obj?.foo ?? obj?.bar)();

(foo || obj?.foo)();

(obj?.foo && foo)();

(foo ? obj?.foo : bar)();

(foo, obj?.bar).baz;

(obj?.foo)`template`;

new (obj?.foo)();

[...obj?.foo];

bar(...obj?.foo);

1 in obj?.foo;

bar instanceof obj?.foo;

for (bar of obj?.foo);

const { bar } = obj?.foo;

[{ bar } = obj?.foo] = [];

with (obj?.foo);

class A extends obj?.foo {}

const a = class A extends obj?.foo {};

async function foo () {
    const { bar } = await obj?.foo;
   (await obj?.foo)();
   (await obj?.foo).bar;
}

Примеры правильного кода для этого правила:

Открыть в Playground
/*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 }:

Открыть в Playground
/*eslint no-unsafe-optional-chaining: ["error", { "disallowArithmeticOperators": true }]*/

+obj?.foo;
-obj?.foo;

obj?.foo + bar;
obj?.foo - bar;
obj?.foo / bar;
obj?.foo * bar;
obj?.foo % bar;
obj?.foo ** bar;

baz += obj?.foo;
baz -= obj?.foo;
baz /= obj?.foo;
baz *= obj?.foo;
baz %= obj?.foo;
baz **= obj?.foo;

async function foo () {
  +await obj?.foo;
  await obj?.foo + bar;
  baz += await obj?.foo;
}

Версия

Это правило появилось в ESLint v7.15.0.

Ресурсы

  • Исходный код правила
  • Исходный код тестов

© OpenJS Foundation and other contributors
Licensed under the MIT License.
https://eslint.org/docs/latest/rules/no-unsafe-optional-chaining

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API