Spec-Zone.ru › ESLint

no-extra-parens

Запрещает ненужные скобки

🔧 Можно исправить автоматически

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

Важно

Это правило было объявлено устаревшим в ESLint v8.53.0. Оно будет удалено в версии v11.0.0. Используйте соответствующее правило из @stylistic/eslint-plugin.

Подробнее

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

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

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

  • Литералы RegExp, например (/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);

enforceForSequenceExpressions

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

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

(a, b);

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

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

enforceForNewInMemberExpressions

Примеры правильного кода для этого правила с параметрами "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();

enforceForFunctionPrototypeMethods

Примеры правильного кода для этого правила с параметрами "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());

allowParensAfterCommentPattern

Чтобы разрешить этому правилу лишние скобки после определённых комментариев, задайте для этого параметра строковый шаблон, который будет передан конструктору 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

Примеры неправильного кода для этого правила с параметром "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
developer.mozilla.org

Ресурсы

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

© 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