禁止使用不安全的参数
禁止使用类型为
any
的值调用函数。
✅
在 "plugin:@typescript-eslint/recommended-type-checked"
中扩展 ESLint 配置 将启用此规则。
💭
此规则需要 类型信息 才能运行。
TypeScript 中的 any
类型是一个危险的“逃生舱口”,它可以绕过类型系统。使用 any
会禁用许多类型检查规则,通常最好只在万不得已的情况下或在原型设计代码时使用它。
尽管您有最好的意图,但 any
类型有时会泄漏到您的代码库中。使用 any
类型参数调用函数会创建一个潜在的安全漏洞和错误来源。
此规则禁止使用 any
作为参数调用函数。这包括将包含 any
类型元素的数组或元组作为函数参数进行展开。
此规则还会比较泛型类型参数类型,以确保您不会在泛型位置将不安全的 any
传递给期望特定类型的接收者。例如,如果您将 Set<any>
作为参数传递给声明为 Set<string>
的参数,它会报错。
.eslintrc.cjs
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 规则更强大,但也需要配置类型检查的 Lint。如果您在启用类型检查规则后遇到性能下降,请参阅性能故障排除。