如何获取包含字符串枚举的接口值的联合类型?
为什么
FooInterface[keyof FooInterface]没有包含枚举类型? 这是TypeScript的联合类型简化规则导致的,具体原因如下:
枚举类型的本质
- 字符串枚举
FooEnum1的实际类型是成员值的字面量"foo",属于string的子类型; - 数字枚举
FooEnum2的实际类型是number(TypeScript默认将普通数字枚举视为宽泛的number类型)。
- 字符串枚举
联合类型的自动简化逻辑
当子类型和它的父类型出现在同一个联合类型中时,TypeScript会自动保留更宽泛的父类型,丢弃子类型:FooEnum1 | string会被简化为string(因为"foo"是string的子类型);FooEnum2 | number会被简化为number(因为数字枚举本身属于number范畴);- 最终
FooInterface[keyof FooInterface]就合并成了string | number。
无基础类型时的特殊情况
当接口仅包含枚举属性时,没有对应的父类型(string/number)存在,TypeScript不会触发简化逻辑,因此联合类型会保留FooEnum1 | FooEnum2。
实现预期需求的解决方法
如果你想保留枚举的具体类型和基础类型的联合,可以显式获取枚举的所有值字面量类型,再与基础类型组合:
type FooInterfaceValuesType = typeof FooEnum1[keyof typeof FooEnum1] | // 获取FooEnum1的所有值字面量类型 typeof FooEnum2[keyof typeof FooEnum2] | // 获取FooEnum2的所有值字面量类型 string | number;
这个类型等价于你预期的FooEnum1 | FooEnum2 | string | number,且会保留枚举的具体值(比如"foo"、1)与宽泛基础类型的联合。
内容的提问来源于stack exchange,提问作者Chuck
相关产品推荐
相关产品推荐

