跳至主要内容

禁止使用不安全的参数

禁止使用类型为 any 的值调用函数。

💭

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

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>());
在游乐场中打开

在某些情况下,该规则允许将 any 类型的参数传递给 unknown

允许的 anyunknown 赋值示例

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。如果您在启用类型检查规则后遇到性能下降,请参阅性能故障排除

资源