禁止混合使用枚举
禁止枚举同时拥有数字和字符串成员。
🔒
在 "plugin:@typescript-eslint/strict-type-checked"
中扩展 ESLint 配置 可以启用此规则。
💭
此规则需要 类型信息 才能运行。
TypeScript 枚举允许为其成员分配数字或字符串值。大多数枚举包含全部数字或全部字符串,但理论上你可以在同一个枚举中混合使用。混合枚举成员类型通常被认为是令人困惑的,是一种不好的做法。
.eslintrc.cjs
module.exports = {
"rules": {
"@typescript-eslint/no-mixed-enums": "error"
}
};
在游乐场中尝试此规则 ↗
示例
- ❌ 错误
- ✅ 正确(显式数字)
- ✅ 正确(隐式数字)
- ✅ 正确(字符串)
混合枚举成员值的迭代陷阱
可以使用 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。如果在启用类型检查规则后遇到性能下降,请参阅 性能故障排除。