My favorite way of defining types for enums in TypeScript is simple yet powerful, though slightly counterintuitive. First, we define a const
with keys and values, then construct a type from it.
const Animal = { Dog: 'dog', Cat: 'cat' } as const; type Animal = typeof Animal[keyof typeof Animal];
It may feel counterintuitive because we create both a const
and a type
with the same name, but it works seamlessly.
We can conveniently use the type like an enum!
if (someAnimal === Animal.Dog) { ... }
This approach offers autocompletion benefits, aligns with functional programming principles, and has zero runtime overhead (unlike enums).