跳至主要内容

禁止不安全的枚举比较

禁止将枚举值与非枚举值进行比较。

💡

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

💭

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

TypeScript 编译器在处理枚举时可能出乎意料地宽松。字符串枚举被广泛认为比数字枚举更安全,但即使是字符串枚举也有一些缺陷。例如,允许将枚举值与字面量进行比较

enum Vegetable {
Asparagus = 'asparagus',
}

declare const vegetable: Vegetable;

vegetable === 'asparagus'; // No error

上面的代码片段应该改为 vegetable === Vegetable.Asparagus。允许在比较中使用字面量会破坏使用枚举的初衷。通过强制使用正确类型化的枚举进行比较

  • 它使代码库更能抵御枚举成员更改值的风险。
  • 它允许代码 IDE 使用“重命名符号”功能快速重命名枚举。
  • 它使代码符合枚举语义,即通过名称引用枚举,并将它们的值视为实现细节。
.eslintrc.cjs
module.exports = {
"rules": {
"@typescript-eslint/no-unsafe-enum-comparison": "error"
}
};

在游乐场中尝试此规则 ↗

示例

enum Fruit {
Apple,
}

declare let fruit: Fruit;

fruit === 0;
在游乐场中打开
enum Vegetable {
Asparagus = 'asparagus',
}

declare let vegetable: Vegetable;

vegetable === 'asparagus';
在游乐场中打开

选项

此规则不可配置。

何时不使用它

如果您不介意数字和/或字面量字符串常量与枚举进行比较,那么您可能不需要此规则。

在极少数情况下,如果依赖于仅作为type导入的第三方枚举,则可能难以遵守此规则。您可以考虑使用ESLint 禁用注释来处理这些特定情况,而不是完全禁用此规则。


类型检查的 lint 规则比传统的 lint 规则更强大,但也需要配置类型检查的 lint。如果您在启用类型检查规则后遇到性能下降,请参阅性能故障排除

资源