跳至主要内容

限制加号操作数

要求加法运算符的两侧操作数类型相同,且为 bigintnumberstring

💭

此规则需要 类型信息 才能运行。

TypeScript 允许使用 + 将两个任意类型的数值加在一起。但是,将不同类型或不同基本类型的数值加在一起通常是程序员错误的标志。

+ 操作组合两个不同类型的数值,或类型不是 bigintnumberstring 的数值时,此规则会报告错误。

.eslintrc.cjs
module.exports = {
"rules": {
"@typescript-eslint/restrict-plus-operands": "error"
}
};

在游乐场中尝试此规则 ↗

示例

let foo = 1n + 1;
let fn = (a: string, b: never) => a + b;
在游乐场中打开

选项

此规则接受以下选项,并在 strictstrict-type-checked 配置中具有更严格的设置。

type Options = [
{
/** Whether to allow `any` typed values. */
allowAny?: boolean;
/** Whether to allow `boolean` typed values. */
allowBoolean?: boolean;
/** Whether to allow potentially `null` or `undefined` typed values. */
allowNullish?: boolean;
/** Whether to allow `bigint`/`number` typed values and `string` typed values to be added together. */
allowNumberAndString?: boolean;
/** Whether to allow `regexp` typed values. */
allowRegExp?: boolean;
/** Whether to skip compound assignments such as `+=`. */
skipCompoundAssignments?: boolean;
},
];

const defaultOptionsRecommended: Options = [
{
allowAny: true,
allowBoolean: true,
allowNullish: true,
allowNumberAndString: true,
allowRegExp: true,
skipCompoundAssignments: false,
},
];

// These options are merged on top of the recommended defaults
const defaultOptionsStrict: Options = [
{
allowAny: false,
allowBoolean: false,
allowNullish: false,
allowNumberAndString: false,
allowRegExp: false,
},
];
注意

我们通常建议不要使用这些选项,因为它们限制了可以检查的错误 + 使用方式的种类。这反过来会严重限制规则可以执行的验证,以确保生成的字符串和数字是正确的。

使用 allow* 选项的更安全的替代方案包括

  • 使用可变参数形式的日志记录 API 来避免需要使用 + 来连接值。
    console.log('The result is ' + true);
    console.log('The result is', true);
  • 使用 .toFixed() 将数字强制转换为格式良好的字符串表示形式。
    const number = 1.123456789;
    const result = 'The number is ' + number.toFixed(2);
    // result === 'The number is 1.12'
  • 对其他类型调用 .toString() 以标记显式且有意的字符串强制转换。
    const arg = '11';
    const regex = /[0-9]/;
    const result =
    'The result of ' +
    regex.toString() +
    '.test("' +
    arg +
    '") is ' +
    regex.test(arg).toString();
    // result === 'The result of /[0-9]/.test("11") is true'

allowAny

此规则使用 { allowAny: true } 的代码示例。

let fn = (a: number, b: []) => a + b;
let fn = (a: string, b: []) => a + b;
在游乐场中打开

allowBoolean

此规则使用 { allowBoolean: true } 的代码示例。

let fn = (a: number, b: unknown) => a + b;
let fn = (a: string, b: unknown) => a + b;
在游乐场中打开

allowNullish

此规则使用 { allowNullish: true } 的代码示例。

let fn = (a: number, b: unknown) => a + b;
let fn = (a: number, b: never) => a + b;
let fn = (a: string, b: unknown) => a + b;
let fn = (a: string, b: never) => a + b;
在游乐场中打开

allowNumberAndString

此规则使用 { allowNumberAndString: true } 的代码示例。

let fn = (a: number, b: unknown) => a + b;
let fn = (a: number, b: never) => a + b;
在游乐场中打开

allowRegExp

此规则使用 { allowRegExp: true } 的代码示例。

let fn = (a: number, b: RegExp) => a + b;
在游乐场中打开

skipCompoundAssignments

此规则使用 { skipCompoundAssignments: false } 的代码示例。

let foo: bigint = 0n;
foo += 1;

let bar: number[] = [1];
bar += 1;
在游乐场中打开

何时不使用它

如果您不介意在值中出现 "[object Object]" 或不正确的类型强制转换的风险,那么您将不需要此规则。

进一步阅读


类型检查的 lint 规则比传统的 lint 规则更强大,但也需要配置 类型检查的 lint。如果您在启用类型检查规则后遇到性能下降,请参阅 性能故障排除

资源