本文へスキップ

restrict-plus-operands

加算の両方のオペランドが同じ型であり、bigintnumber、またはstringであることを要求します。

拡張 "plugin:@typescript-eslint/recommended-type-checked" ESLint設定 で有効にすると、このルールが有効になります。

💭

このルールは 型情報 が必要です。

TypeScriptでは、+を使用して任意の型の2つの値を加算できます。しかし、異なる型、または同じプリミティブ型でない値を加算することは、多くの場合、プログラマーエラーの兆候です。

このルールは、+演算が異なる型の2つの値、またはbigintnumberstring以外の型の値を組み合わせている場合に報告します。

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

Playgroundでこのルールを試してみてください ↗

let foo = 1n + 1;
let fn = (a: string, b: never) => a + b;
Playgroundで開く

オプション

このルールは次のオプションを受け入れ、strictおよびstrict-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;
Playgroundで開く

allowBoolean

{ allowBoolean: true }を使用したこのルールのコード例

let fn = (a: number, b: unknown) => a + b;
let fn = (a: string, b: unknown) => a + b;
Playgroundで開く

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;
Playgroundで開く

allowNumberAndString

{ allowNumberAndString: true }を使用したこのルールのコード例

let fn = (a: number, b: unknown) => a + b;
let fn = (a: number, b: never) => a + b;
Playgroundで開く

allowRegExp

{ allowRegExp: true }を使用したこのルールのコード例

let fn = (a: number, b: RegExp) => a + b;
Playgroundで開く

skipCompoundAssignments

{ skipCompoundAssignments: false }を使用したこのルールのコード例

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

let bar: number[] = [1];
bar += 1;
Playgroundで開く

使用しない場合

"[object Object]"のリスクや値の型強制が間違っていることを気にしない場合は、このルールは必要ありません。

参考資料


型チェック付きのlintルールは従来のlintルールよりも強力ですが、型チェック付きのlintingの設定も必要です。型チェック付きのルールを有効にした後にパフォーマンスの低下が発生した場合は、パフォーマンスに関するトラブルシューティングを参照してください。

リソース