restrict-plus-operands
加算の両方のオペランドが同じ型であり、
bigint
、number
、またはstring
であることを要求します。
拡張 "plugin:@typescript-eslint/recommended-type-checked"
を ESLint設定 で有効にすると、このルールが有効になります。
このルールは 型情報 が必要です。
TypeScriptでは、+
を使用して任意の型の2つの値を加算できます。しかし、異なる型、または同じプリミティブ型でない値を加算することは、多くの場合、プログラマーエラーの兆候です。
このルールは、+
演算が異なる型の2つの値、またはbigint
、number
、string
以外の型の値を組み合わせている場合に報告します。
module.exports = {
"rules": {
"@typescript-eslint/restrict-plus-operands": "error"
}
};
Playgroundでこのルールを試してみてください ↗
例
- ❌ 正しくない
- ✅ 正しい
let foo = 1n + 1;
let fn = (a: string, b: never) => a + b;
Playgroundで開くlet foo = 1n + 1n;
let fn = (a: string, b: string) => 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で開くlet fn = (a: number, b: any) => a + b;
let fn = (a: string, b: any) => a + b;
Playgroundで開くallowBoolean
{ allowBoolean: true }
を使用したこのルールのコード例
- ❌ 正しくない
- ✅ 正しい
let fn = (a: number, b: unknown) => a + b;
let fn = (a: string, b: unknown) => a + b;
Playgroundで開くlet fn = (a: number, b: boolean) => a + b;
let fn = (a: string, b: boolean) => 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で開くlet fn = (a: number, b: undefined) => a + b;
let fn = (a: number, b: null) => a + b;
let fn = (a: string, b: undefined) => a + b;
let fn = (a: string, b: null) => a + b;
Playgroundで開くallowNumberAndString
{ allowNumberAndString: true }
を使用したこのルールのコード例
- ❌ 正しくない
- ✅ 正しい
let fn = (a: number, b: unknown) => a + b;
let fn = (a: number, b: never) => a + b;
Playgroundで開くlet fn = (a: number, b: string) => a + b;
let fn = (a: number, b: number | string) => a + b;
Playgroundで開くallowRegExp
{ allowRegExp: true }
を使用したこのルールのコード例
- ❌ 正しくない
- ✅ 正しい
let fn = (a: number, b: RegExp) => a + b;
Playgroundで開くlet fn = (a: string, b: RegExp) => a + b;
Playgroundで開くskipCompoundAssignments
{ skipCompoundAssignments: false }
を使用したこのルールのコード例
- ❌ 正しくない
- ✅ 正しい
let foo: bigint = 0n;
foo += 1;
let bar: number[] = [1];
bar += 1;
Playgroundで開くlet foo: bigint = 0n;
foo += 1n;
let bar: number = 1;
bar += 1;
Playgroundで開く使用しない場合
"[object Object]"
のリスクや値の型強制が間違っていることを気にしない場合は、このルールは必要ありません。
関連ルール
参考資料
型チェック付きのlintルールは従来のlintルールよりも強力ですが、型チェック付きのlintingの設定も必要です。型チェック付きのルールを有効にした後にパフォーマンスの低下が発生した場合は、パフォーマンスに関するトラブルシューティングを参照してください。