跳至主要内容

禁止显式使用 any 类型

禁止使用 any 类型。

🔧

此规则报告的一些问题可以通过 --fix ESLint 命令行选项 自动修复。

💡

此规则报告的一些问题可以通过编辑器 建议 手动修复。

TypeScript 中的 any 类型是一个危险的“逃生门”,它会绕过类型系统。使用 any 会禁用许多类型检查规则,通常最好只在万不得已的情况下或在原型代码时使用。此规则报告显式使用 any 关键字作为类型注释的情况。

any 的更可取的替代方案包括

  • 如果类型已知,则在 interfacetype 中描述它
  • 如果类型未知,则使用更安全的 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> {}
在游乐场中打开

选项

此规则接受以下选项

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 禁用注释,而不是完全禁用此规则。

进一步阅读

资源