禁止显式使用 any 类型
禁止使用
any类型。
✅
在 "plugin:@typescript-eslint/recommended" 的 ESLint 配置文件 中扩展此规则。
🔧
此规则报告的一些问题可以通过 --fix ESLint 命令行选项 自动修复。
💡
此规则报告的一些问题可以通过编辑器 建议 手动修复。
TypeScript 中的 any 类型是一个危险的“逃生门”,它会绕过类型系统。使用 any 会禁用许多类型检查规则,通常最好只在万不得已的情况下或在原型代码时使用。此规则报告显式使用 any 关键字作为类型注释的情况。
any 的更可取的替代方案包括
- 如果类型已知,则在
interface或type中描述它 - 如果类型未知,则使用更安全的
unknown类型
TypeScript 的
--noImplicitAny编译器选项可以防止隐式any,但不能像此规则那样防止显式使用any。
.eslintrc.cjs
module.exports = {
"rules": {
"@typescript-eslint/no-explicit-any": "error"
}
};
在游乐场中尝试此规则 ↗
示例
- ❌ 错误
- ✅ 正确
const age: any = 'seventeen';
在游乐场中打开const ages: any[] = ['seventeen'];
在游乐场中打开const ages: Array<any> = ['seventeen'];
在游乐场中打开function greet(): any {}
在游乐场中打开function greet(): any[] {}
在游乐场中打开function greet(): Array<any> {}
在游乐场中打开function greet(): Array<Array<any>> {}
在游乐场中打开function greet(param: Array<any>): string {}
在游乐场中打开function greet(param: Array<any>): Array<any> {}
在游乐场中打开const age: number = 17;
在游乐场中打开const ages: number[] = [17];
在游乐场中打开const ages: Array<number> = [17];
在游乐场中打开function greet(): string {}
在游乐场中打开function greet(): string[] {}
在游乐场中打开function greet(): Array<string> {}
在游乐场中打开function greet(): Array<Array<string>> {}
在游乐场中打开function greet(param: Array<string>): string {}
在游乐场中打开function greet(param: Array<string>): Array<string> {}
在游乐场中打开选项
此规则接受以下选项
type Options = [
{
/** Whether to enable auto-fixing in which the `any` type is converted to the `unknown` type. */
fixToUnknown?: boolean;
/** Whether to ignore rest parameter arrays. */
ignoreRestArgs?: boolean;
},
];
const defaultOptions: Options = [
{ fixToUnknown: false, ignoreRestArgs: false },
];
fixToUnknown
默认情况下,此规则不会提供自动 ESLint 修复:仅提供建议。将类型切换到 unknown 更安全,但可能会导致其他类型错误。
启用 { "fixToUnknown": true } 会使规则具有自动修复器,以将 : any 替换为 : unknown。
ignoreRestArgs
一个布尔值,用于指定是否将来自剩余运算符的数组视为正常。默认值为 false。
以下示例在 {ignoreRestArgs: false} 时为错误,但在 {ignoreRestArgs: true} 时为正确。
function foo1(...args: any[]): void {}
function foo2(...args: readonly any[]): void {}
function foo3(...args: Array<any>): void {}
function foo4(...args: ReadonlyArray<any>): void {}
declare function bar(...args: any[]): void;
const baz = (...args: any[]) => {};
const qux = function (...args: any[]) {};
type Quux = (...args: any[]) => void;
type Quuz = new (...args: any[]) => void;
interface Grault {
(...args: any[]): void;
}
interface Corge {
new (...args: any[]): void;
}
interface Garply {
f(...args: any[]): void;
}
在游乐场中打开何时不使用它
any 始终是一个危险的逃生门。只要有可能,避免使用它总是更安全。TypeScript 的 unknown 几乎总是比 any 更可取。
但是,在某些情况下,使用 any 是必要的。
- 如果您的项目尚未完全迁移到 TypeScript,则可以在类型未知或无法表示的地方暂时使用
any。 - 如果某个外部包还没有类型定义,而您想在添加
.d.ts文件之前使用any。 - 您正在处理特别复杂或细微的代码,这些代码还无法在 TypeScript 类型系统中表示。
对于这些特定情况,您可以考虑使用 ESLint 禁用注释,而不是完全禁用此规则。
相关内容
进一步阅读
- TypeScript
any类型 - TypeScript 的
unknown类型 - TypeScript
any类型文档 - TypeScript
unknown类型发布说明