如何创建继承已有枚举属性的TypeScript新枚举?
TypeScript 实现枚举的“继承”效果
TypeScript 原生不支持枚举使用 extends 语法,也没法在枚举内部用展开运算符继承已有成员,但可以通过以下两种方式实现类似继承的效果,满足你访问 Enum2.a 并继承其值的需求:
方法一:对象合并 + 类型别名
枚举编译后本质是 JS 对象,我们可以通过对象展开合并原有枚举的成员,再配合类型别名实现类型约束:
enum Enum1 { a = 'a' } // 合并枚举成员到新对象 const Enum2 = { ...Enum1, b: 'b' } as const; // 定义类型,包含原有枚举和新成员 type Enum2 = Enum1 | typeof Enum2.b;
这样你可以直接访问 Enum2.a 和 Enum2.b,同时类型检查会正常生效。
方法二:联合类型 + 约束对象
如果需要更严格的类型约束,可以先定义包含原有枚举的联合类型,再创建对应的对象:
enum Enum1 { a = 'a' } // 定义联合类型,涵盖原有枚举和新成员 type Enum2Type = Enum1 | 'b'; // 创建对象并约束类型 const Enum2 = { ...Enum1, b: 'b' } as { [K in Enum2Type]: K };
这种方式同样能实现需求,且类型层面的约束更严谨。
注意点
- 字符串枚举编译后没有反向映射,合并后的对象也不会有;如果是数字枚举,合并时要注意反向映射的冲突问题,不建议轻易这么做。
- 以上是模拟枚举继承的效果,并非类那样的真正继承,但完全能满足你的使用场景。
内容的提问来源于stack exchange,提问作者Luiz
相关产品推荐
相关产品推荐

