no-mixed-enums
数値と文字列の両方のメンバを持つ列挙型を禁止します。
🔒
拡張 "plugin:@typescript-eslint/strict-type-checked"
を ESLint設定 で有効にすると、このルールが有効になります。
💭
このルールには 型情報 が必要です。
TypeScriptの列挙型では、数値または文字列の値をメンバに割り当てることができます。ほとんどの列挙型はすべて数値またはすべて文字列ですが、理論的には同じ列挙型内で数値と文字列を混在させることができます。列挙型メンバの型を混在させることは、一般的に混乱を招き、推奨されない方法です。
.eslintrc.cjs
module.exports = {
"rules": {
"@typescript-eslint/no-mixed-enums": "error"
}
};
Playgroundでこのルールを試してみましょう ↗
例
- ❌ 正しくない例
- ✅ 正しい例(明示的な数値)
- ✅ 正しい例(暗黙的な数値)
- ✅ 正しい例(文字列)
enum Status {
Unknown,
Closed = 1,
Open = 'open',
}
Playgroundで開くenum Status {
Unknown = 0,
Closed = 1,
Open = 2,
}
Playgroundで開くenum Status {
Unknown,
Closed,
Open,
}
Playgroundで開くenum Status {
Unknown = 'unknown',
Closed = 'closed',
Open = 'open',
}
Playgroundで開く混合列挙型メンバ値の反復処理における落とし穴
列挙型値は、`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ルールよりも強力ですが、型チェック済みlintingの設定も必要です。型チェック済みルールを有効にした後にパフォーマンスの低下が発生する場合は、パフォーマンスに関するトラブルシューティングを参照してください。