禁止显式使用 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
类型发布说明