From time to time you need to extend an enum in TypeScript, however, we can't use extends
construction like in case of interface
.
enum MySuperEnum {
ONE,
TWO
}
enum MyMoreSuperEnum extends MySuperEnum // This is wrong
Of course, we can create one more enum and then create union type:
enum MySuperEnumExtender {
THREE
}
type MyUnionType = MySuperEnum | MySuperEnumExtender;
What we can get and why this approach is not good? MyUnionType
is a type, we can't use it like enum to call its props.
So what we can do then?
First of all, we should use another and more preferable way of enum implementation with const
. Why?
// describe an enum object
const MySuperEnum = {
ONE: 'ONE',
TWO: 'TWO'
} as const
// create the MySuperEnum type
type MySuperEnum = typeof MySuperEnum[keyof typeof MySuperEnum];
What is as const
? Please click to find out more.
Cool! Now our MySuperEnum
is defined in a different way!
It is time to create new MyMoreSuperEnum
that will be extended with MySuperEnum
.
// describe an enum object
const MyMoreSuperEnum = {
...MySuperEnum,
THREE: 'THREE'
} as const
// create the MyMoreSuperEnum type
type MyMoreSuperEnum = typeof MyMoreSuperEnum[keyof typeof MyMoreSuperEnum];
Profit. Hope this trick will be useful for you.
Top comments (0)