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" по умолчанию:
/* 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" по умолчанию:
/* 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 }:
/* 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 }:
/* 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 }:
/* eslint no-extra-parens: ["error", "all", { "nestedBinaryExpressions": false }] */
x = a || (b && c);
x = a + (b * c);
x = (a * b) / c;
ternaryOperandBinaryExpressions
Примеры правильного кода для этого правила с параметрами "all" и { "ternaryOperandBinaryExpressions": false }:
/* 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" }:
/* eslint no-extra-parens: ["error", "all", { ignoreJSX: "all" }] */
const ThisComponent = (<div />)
const ThatComponent = (
<div
prop={true}
/>
)
Примеры неправильного кода для этого правила с параметрами all и { "ignoreJSX": "multi-line" }:
/* eslint no-extra-parens: ["error", "all", { ignoreJSX: "multi-line" }] */
const ThisComponent = <div />)
const ThatComponent = <div><p /></div>)
Примеры правильного кода для этого правила с параметрами all и { "ignoreJSX": "multi-line" }:
/* eslint no-extra-parens: ["error", "all", { ignoreJSX: "multi-line" }] */
const ThisComponent = (
<div><p /></div>
)
const ThatComponent = (
<div
prop={true}
/>
)
Примеры неправильного кода для этого правила с параметрами all и { "ignoreJSX": "single-line" }:
/* eslint no-extra-parens: ["error", "all", { ignoreJSX: "single-line" }] */
const ThisComponent =
<div><p /></div>
)
const ThatComponent =
<div
prop={true}
/>
)
Примеры правильного кода для этого правила с параметрами all и { "ignoreJSX": "single-line" }:
/* eslint no-extra-parens: ["error", "all", { ignoreJSX: "single-line" }] */
const ThisComponent = (<div />)
const ThatComponent = (<div><p /></div>)
enforceForArrowConditionals
Примеры правильного кода для этого правила с параметрами "all" и { "enforceForArrowConditionals": false }:
/* eslint no-extra-parens: ["error", "all", { "enforceForArrowConditionals": false }] */
const b = a => 1 ? 2 : 3;
const d = c => (1 ? 2 : 3);
enforceForSequenceExpressions
Примеры правильного кода для этого правила с параметрами "all" и { "enforceForSequenceExpressions": false }:
/* eslint no-extra-parens: ["error", "all", { "enforceForSequenceExpressions": false }] */
(a, b);
if ((val = foo(), val < 10)) {}
while ((val = foo(), val < 10));
enforceForNewInMemberExpressions
Примеры правильного кода для этого правила с параметрами "all" и { "enforceForNewInMemberExpressions": false }:
/* 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 }:
/* 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" }:
/* 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":
/* eslint no-extra-parens: ["error", "functions"] */
(function foo() {}))();
var y = function () {return 1;});
Примеры правильного кода для этого правила с параметром "functions":
/* 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);
Связанные правила
Версия
Это правило было добавлено в ESLint v0.1.4.
Дополнительные материалы
Ресурсы
© OpenJS Foundation and other contributors
Licensed under the MIT License.
https://eslint.org/docs/latest/rules/no-extra-parens