跳至主要内容

禁止混合使用枚举

禁止枚举同时拥有数字和字符串成员。

🔒

"plugin:@typescript-eslint/strict-type-checked" 中扩展 ESLint 配置 可以启用此规则。

💭

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

TypeScript 枚举允许为其成员分配数字或字符串值。大多数枚举包含全部数字或全部字符串,但理论上你可以在同一个枚举中混合使用。混合枚举成员类型通常被认为是令人困惑的,是一种不好的做法。

.eslintrc.cjs
module.exports = {
"rules": {
"@typescript-eslint/no-mixed-enums": "error"
}
};

在游乐场中尝试此规则 ↗

示例

enum Status {
Unknown,
Closed = 1,
Open = 'open',
}
在游乐场中打开

混合枚举成员值的迭代陷阱

可以使用 Object.entries/Object.keys/Object.values 迭代枚举值。

如果所有枚举成员都是字符串,则项目数量将与枚举成员数量匹配。

enum Status {
Closed = 'closed',
Open = 'open',
}

// ['closed', 'open']
Object.values(Status);

但如果枚举包含用数字初始化的成员——包括隐式初始化的数字——那么对该枚举的迭代也将包括这些数字。

enum Status {
Unknown,
Closed = 1,
Open = 'open',
}

// ["Unknown", "Closed", 0, 1, "open"]
Object.values(Status);

选项

此规则不可配置。

何时不使用它

如果你不介意混合枚举成员值的混淆,并且不迭代枚举,你可以安全地禁用此规则。


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

资源