Spec-Zone.ru › ESLint

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 после этого.

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

Открыть в 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 {}

var 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)();

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 }.

Открыть в 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