no-unsafe-argument
型 `any` の値で関数を呼び出すことを禁止します。
拡張 "plugin:@typescript-eslint/"recommended-type-checked"
を ESLint 設定 で有効にすると、このルールが有効になります。
このルールを実行するには 型情報 が必要です。
TypeScript の `any` 型は、型システムからの危険な「エスケープハッチ」です。 `any` を使用すると、多くの型チェックルールが無効になるため、一般的には最後の手段として、またはコードのプロトタイピング時にのみ使用するのが最善です。
最善を尽くしても、`any` 型がコードベースに紛れ込んでしまうことがあります。 `any` 型の引数で関数を呼び出すと、潜在的なセキュリティホールとバグの原因が生じます。
このルールは、引数に `any` を持つ関数の呼び出しを禁止します。 これには、`any` 型の要素を持つ配列またはタプルを関数引数としてスプレッドすることも含まれます。
また、このルールは、ジェネリック型引数の型を比較して、特定の型を期待している受信側に、ジェネリックの位置に安全でない `any` を渡さないようにします。 たとえば、`Set<any>` を `Set<string>` として宣言されたパラメータに渡すとエラーになります。
module.exports = {
"rules": {
"@typescript-eslint/no-unsafe-argument": "error"
}
};
プレイグラウンドでこのルールを試す ↗
例
- ❌ 間違い
- ✅ 正しい
declare function foo(arg1: string, arg2: number, arg3: string): void;
const anyTyped = 1 as any;
foo(...anyTyped);
foo(anyTyped, 1, 'a');
const anyArray: any[] = [];
foo(...anyArray);
const tuple1 = ['a', anyTyped, 'b'] as const;
foo(...tuple1);
const tuple2 = [1] as const;
foo('a', ...tuple, anyTyped);
declare function bar(arg1: string, arg2: number, ...rest: string[]): void;
const x = [1, 2] as [number, ...number[]];
foo('a', ...x, anyTyped);
declare function baz(arg1: Set<string>, arg2: Map<string, string>): void;
foo(new Set<any>(), new Map<any, string>());
プレイグラウンドで開くdeclare function foo(arg1: string, arg2: number, arg3: string): void;
foo('a', 1, 'b');
const tuple1 = ['a', 1, 'b'] as const;
foo(...tuple1);
declare function bar(arg1: string, arg2: number, ...rest: string[]): void;
const array: string[] = ['a'];
bar('a', 1, ...array);
declare function baz(arg1: Set<string>, arg2: Map<string, string>): void;
foo(new Set<string>(), new Map<string, string>());
プレイグラウンドで開くルールでは、`any` の引数を `unknown` に渡すことが許可される場合があります。
許可される `any` から `unknown` への割り当ての例
declare function foo(arg1: unknown, arg2: Set<unknown>, arg3: unknown[]): void;
foo(1 as any, new Set<any>(), [] as any[]);
プレイグラウンドで開くオプション
このルールは設定できません。
使用しない場合
コードベースに既存の `any` や安全でないコード領域が多数ある場合、このルールを有効にするのが難しい場合があります。 プロジェクトの安全でない領域での型安全性を高めるまでは、`no-unsafe-*` ルールをスキップする方が簡単な場合があります。 このルールを完全に無効にする代わりに、ESLintの無効化コメントを使用することを検討してください。
関連
型チェックされた lint ルールは、従来の lint ルールよりも強力ですが、型チェックされた lintingを設定する必要があります。 型チェックルールを有効にした後にパフォーマンスの低下が発生した場合は、パフォーマンストラブルシューティングを参照してください。