# no-extra-parens

禁止不必要的括号

一些该规则报告的问题可以通过 --fix 命令行选项 自动修复

该规则将括号的使用限制在必要的地方。

# 规则详情

此规则始终忽略以下内容周围的额外括号:

  • (/abc/).test(var) 等 RegExp 字面,以避免与 wrap-regex 规则冲突
  • 立即调用的函数表达式(也称为 IIFE),例如 var x = (function () {})();var x = (function () {}());,以避免与 wrap-iife 规则冲突
  • 箭头函数参数以避免与 arrow-parens 规则冲突

# 选项

此规则有一个字符串选项:

  • "all"(默认)不允许在任何表达式周围使用不必要的括号
  • "functions" 仅在函数表达式周围不允许不必要的括号

此规则有一个对象选项,用于 "all" 选项的例外情况:

  • "conditionalAssign": false 允许在条件测试表达式中的赋值周围使用额外的括号
  • "returnAssign": false 允许在 return 语句中的赋值周围使用额外的括号
  • "nestedBinaryExpressions": false 允许在嵌套的二进制表达式中使用额外的括号
  • "ignoreJSX": "none|all|multi-line|single-line" 允许在 no/all/multi-line/single-line JSX 组件周围使用额外的括号。默认为 none
  • "enforceForArrowConditionals": false 允许在作为箭头函数主体的三元表达式周围加上额外的括号
  • "enforceForSequenceExpressions": false 允许在序列表达式周围加上额外的括号
  • "enforceForNewInMemberExpressions": false 允许在成员表达式中的 new 表达式周围加上额外的括号
  • "enforceForFunctionPrototypeMethods": false 允许在函数表达式的直接 .call.apply 方法调用以及同一上下文中的函数表达式周围使用额外的括号。

# 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);

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

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

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

此规则使用默认 "all" 选项的正确代码示例:

/* eslint no-extra-parens: "error" */

(0).toString();

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

({}.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 a(b) {
  return (b = 1);
}

function a(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;

# ignoreJSX

此规则使用 all{ "ignoreJSX": "all" } 选项的正确代码示例:

/* eslint no-extra-parens: ["error", "all", { ignoreJSX: "all" }] */
const Component = (<div />)
const Component = (
    <div
        prop={true}
    />
)

带有 all{ "ignoreJSX": "multi-line" } 选项的此规则的错误代码示例:

/* eslint no-extra-parens: ["error", "all", { ignoreJSX: "multi-line" }] */
const Component = (<div />)
const Component = (<div><p /></div>)

此规则使用 all{ "ignoreJSX": "multi-line" } 选项的正确代码示例:

/* eslint no-extra-parens: ["error", "all", { ignoreJSX: "multi-line" }] */
const Component = (
    <div>
        <p />
    </div>
)
const Component = (
    <div
        prop={true}
    />
)

带有 all{ "ignoreJSX": "single-line" } 选项的此规则的错误代码示例:

/* eslint no-extra-parens: ["error", "all", { ignoreJSX: "single-line" }] */
const Component = (
    <div>
        <p />
    </div>
)
const Component = (
    <div
        prop={true}
    />
)

此规则使用 all{ "ignoreJSX": "single-line" } 选项的正确代码示例:

/* eslint no-extra-parens: ["error", "all", { ignoreJSX: "single-line" }] */
const Component = (<div />)
const Component = (<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());

# 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);
Last Updated: 5/13/2023, 8:55:38 PM