Skip to main content

no-mixed-enums

Disallow enums from having both number and string members.

πŸ’­

This rule requires type information to run.

TypeScript enums are allowed to assign numeric or string values to their members. Most enums contain either all numbers or all strings, but in theory you can mix-and-match within the same enum. Mixing enum member types is generally considered confusing and a bad practice.

eslint.config.mjs
export default tseslint.config({
rules: {
"@typescript-eslint/no-mixed-enums": "error"
}
});

Try this rule in the playground β†—

Examples​

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

Iteration Pitfalls of Mixed Enum Member Values​

Enum values may be iterated over using Object.entries/Object.keys/Object.values.

If all enum members are strings, the number of items will match the number of enum members:

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

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

But if the enum contains members that are initialized with numbers -including implicitly initialized numbersβ€” then iteration over that enum will include those numbers as well:

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

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

Options​

This rule is not configurable.

When Not To Use It​

If you don't mind the confusion of mixed enum member values and don't iterate over enums, you can safely disable this rule.


Type checked lint rules are more powerful than traditional lint rules, but also require configuring type checked linting.

See Troubleshooting > Linting with Type Information > Performance if you experience performance degradations after enabling type checked rules.

Resources​