Spec-Zone.ru › ESLint

no-extra-parens

Запретить лишние скобки

🔧 Исправимо

Некоторые проблемы, выявленные этим правилом, могут быть автоматически исправлены с помощью опции командной строки --fix командной строки

Это правило было устаревшим в ESLint v8.53.0. Пожалуйста, используйте соответствующее правило соответствующее правило в @stylistic/eslint-plugin-js.

Это правило ограничивает использование скобок только там, где они необходимы.

Подробности правила

Это правило всегда игнорирует лишние скобки вокруг следующего:

  • Литералы регулярных выражений, такие как (/abc/).test(var) для предотвращения конфликтов с правилом wrap-regex
  • немедленные выражения функций (также известные как IIFE), такие как var x = (function () {})(); и var x = (function () {}()); для предотвращения конфликтов с правилом wrap-iife
  • аргументы стрелочных функций для предотвращения конфликтов с правилом arrow-parens

Проблемы, выявленные этим правилом, могут быть автоматически исправлены, за исключением случаев, когда удаление скобок создаёт новую директиву, поскольку это может изменить семантику кода. Например, следующий скрипт выводит object в консоль, но если скобки вокруг "use strict" будут удалены, он будет выводить undefined вместо этого.

<!--
// this is a script
// -->

("use strict");

function test() {
    console.log(typeof this);
}

test();

В этом случае правило не будет пытаться удалить скобки вокруг "use strict" но по-прежнему будет сообщать о них как о проблеме.

Параметры

Это правило имеет строковый параметр:

  • "all" (по умолчанию) запрещает лишние скобки вокруг любого выражения
  • "functions" запрещает лишние скобки только вокруг выражений функций

Это правило имеет параметр типа объект для исключений из параметра "all":

  • "conditionalAssign": false разрешает лишние скобки вокруг присваиваний в условных выражениях
  • "returnAssign": false разрешает лишние скобки вокруг присваиваний в return операторах
  • "nestedBinaryExpressions": false разрешает лишние скобки во вложенных бинарных выражениях
  • "ternaryOperandBinaryExpressions": false разрешает лишние скобки вокруг бинарных выражений, являющихся операндами условного ?:
  • "ignoreJSX": "none|all|multi-line|single-line" разрешает лишние скобки вокруг компонентов JSX, которые являются пустыми, или содержат одно, или несколько строк, или все строки. По умолчанию none.
  • "enforceForArrowConditionals": false разрешает лишние скобки вокруг условных операторов, которые являются телом стрелочной функции
  • "enforceForSequenceExpressions": false разрешает лишние скобки вокруг последовательностей выражений
  • "enforceForNewInMemberExpressions": false разрешает лишние скобки вокруг new выражений в выражениях членов
  • "enforceForFunctionPrototypeMethods": false разрешает лишние скобки вокруг немедленных вызовов .call и .apply методов для выражений функций и вокруг выражений функций в том же контексте
  • "allowParensAfterCommentPattern": "any-string-pattern" разрешает лишние скобки, предшествующие комментарию, соответствующему регулярному выражению.

all

Примеры некорректного кода для этого правила с параметром "all" по умолчанию:

Открыть в Playground
/* eslint no-extra-parens: "error" */

a = (b * c);

(a * b) + c;

for (a in (b, c));

for (a in (b));

for (a of (b));

typeof (a);

(Object.prototype.toString.call());

class A {
    [(x)] = 1;
}

class B {
    x = (y + z);
}

Примеры корректного кода для этого правила с параметром "all" по умолчанию:

Открыть в Playground
/* eslint no-extra-parens: "error" */

(0).toString();

({}.toString.call());

(function(){}) ? a() : b();

(/^a$/).test(x);

for (a of (b, c));

for (a of b);

for (a in b, c);

for (a in b);

class A {
    [x] = 1;
}

class B {
    x = y + z;
}

conditionalAssign

Примеры корректного кода для этого правила с параметрами "all" и { "conditionalAssign": false }:

Открыть в Playground
/* eslint no-extra-parens: ["error", "all", { "conditionalAssign": false }] */

while ((foo = bar())) {}

if ((foo = bar())) {}

do; while ((foo = bar()))

for (;(a = b););

returnAssign

Примеры корректного кода для этого правила с параметрами "all" и { "returnAssign": false }:

Открыть в Playground
/* eslint no-extra-parens: ["error", "all", { "returnAssign": false }] */

function a1(b) {
  return (b = 1);
}

function a2(b) {
  return b ? (c = d) : (c = e);
}

b => (b = 1);

b => b ? (c = d) : (c = e);

nestedBinaryExpressions

Примеры корректного кода для этого правила с параметрами "all" и { "nestedBinaryExpressions": false }:

Открыть в Playground
/* eslint no-extra-parens: ["error", "all", { "nestedBinaryExpressions": false }] */

x = a || (b && c);
x = a + (b * c);
x = (a * b) / c;

ternaryOperandBinaryExpressions

Примеры корректного кода для этого правила с параметрами "all" и { "ternaryOperandBinaryExpressions": false }:

Открыть в Playground
/* eslint no-extra-parens: ["error", "all", { "ternaryOperandBinaryExpressions": false }] */

(a && b) ? foo : bar;

(a - b > a) ? foo : bar;

foo ? (bar || baz) : qux;

foo ? bar : (baz || qux);

ignoreJSX

Примеры корректного кода для этого правила с параметрами all и { "ignoreJSX": "all" }:

Открыть в Playground
/* eslint no-extra-parens: ["error", "all", { ignoreJSX: "all" }] */
const ThisComponent = (<div />)
const ThatComponent = (
    <div
        prop={true}
    />
)

Примеры некорректного кода для этого правила с параметрами all и { "ignoreJSX": "multi-line" }:

Открыть в Playground
/* eslint no-extra-parens: ["error", "all", { ignoreJSX: "multi-line" }] */
const ThisComponent = (<div />)
const ThatComponent = (<div><p /></div>)

Примеры корректного кода для этого правила с параметрами all и { "ignoreJSX": "multi-line" }:

Открыть в Playground
/* eslint no-extra-parens: ["error", "all", { ignoreJSX: "multi-line" }] */
const ThisComponent = (
    <div><p /></div>
)
const ThatComponent = (
    <div
        prop={true}
    />
)

Примеры некорректного кода для этого правила с параметрами all и { "ignoreJSX": "single-line" }:

Открыть в Playground
/* eslint no-extra-parens: ["error", "all", { ignoreJSX: "single-line" }] */
const ThisComponent = (
    <div><p /></div>
)
const ThatComponent = (
    <div
        prop={true}
    />
)

Примеры корректного кода для этого правила с параметрами all и { "ignoreJSX": "single-line" }:

Открыть в Playground
/* eslint no-extra-parens: ["error", "all", { ignoreJSX: "single-line" }] */
const ThisComponent = (<div />)
const ThatComponent = (<div><p /></div>)

enforceForArrowConditionals

Примеры корректного кода для этого правила с параметрами "all" и { "enforceForArrowConditionals": false }:

Открыть в Playground
/* eslint no-extra-parens: ["error", "all", { "enforceForArrowConditionals": false }] */

const b = a => 1 ? 2 : 3;
const d = c => (1 ? 2 : 3);

Краткое описание полей для выражений последовательности

Примеры правильного кода для этой правила с "all" и { "enforceForSequenceExpressions": false } параметрами:

Открыть в Playground
/* eslint no-extra-parens: ["error", "all", { "enforceForSequenceExpressions": false }] */

(a, b);

if ((val = foo(), val < 10)) {}

while ((val = foo(), val < 10));

Краткое описание полей для выражений new in member

Примеры правильного кода для этого правила с "all" и { "enforceForNewInMemberExpressions": false } параметрами:

Открыть в Playground
/* eslint no-extra-parens: ["error", "all", { "enforceForNewInMemberExpressions": false }] */

const foo = (new Bar()).baz;

const quux = (new Bar())[baz];

(new Bar()).doSomething();

Краткое описание полей для методов прототипов функций

Примеры правильного кода для этого правила с "all" и { "enforceForFunctionPrototypeMethods": false } параметрами:

Открыть в Playground
/* eslint no-extra-parens: ["error", "all", { "enforceForFunctionPrototypeMethods": false }] */

const foo = (function () {}).call();

const bar = (function () {}).apply();

const baz = (function () {}.call());

const quux = (function () {}.apply());

Разрешение скобок после комментария

Чтобы это правило разрешало дополнительные скобки, предшествующие конкретным комментариям, установите этот параметр в строковый шаблон, который будет передан конструктору RegExp конструктора.

Примеры правильного кода для этого правила с "all" и { "allowParensAfterCommentPattern": "@type" } параметрами:

Открыть в Playground
/* eslint no-extra-parens: ["error", "all", { "allowParensAfterCommentPattern": "@type" }] */

const span = /**@type {HTMLSpanElement}*/(event.currentTarget);

if (/** @type {Foo | Bar} */(options).baz) console.log('Lint free');

foo(/** @type {Bar} */ (bar), options, {
    name: "name",
    path: "path",
});

if (foo) {
    /** @type {Bar} */
    (bar).prop = false;
}

Функции

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

Открыть в Playground
/* eslint no-extra-parens: ["error", "functions"] */

((function foo() {}))();

var y = (function () {return 1;});

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

Открыть в Playground
/* eslint no-extra-parens: ["error", "functions"] */

(0).toString();

(Object.prototype.toString.call());

({}.toString.call());

(function(){} ? a() : b());

(/^a$/).test(x);

a = (b * c);

(a * b) + c;

typeof (a);

Связанные правила

  • arrow-parens
  • no-cond-assign
  • no-return-assign

Версия

Это правило было добавлено в ESLint v0.1.4.

Дополнительные материалы

Приоритет операторов - JavaScript | MDN

Ресурсы

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

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

Spec-Zone.ru

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