You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取包含字符串枚举的接口值的联合类型?

为什么FooInterface[keyof FooInterface]没有包含枚举类型?

这是TypeScript的联合类型简化规则导致的,具体原因如下:

  1. 枚举类型的本质

    • 字符串枚举FooEnum1的实际类型是成员值的字面量"foo",属于string的子类型;
    • 数字枚举FooEnum2的实际类型是number(TypeScript默认将普通数字枚举视为宽泛的number类型)。
  2. 联合类型的自动简化逻辑
    当子类型和它的父类型出现在同一个联合类型中时,TypeScript会自动保留更宽泛的父类型,丢弃子类型:

    • FooEnum1 | string会被简化为string(因为"foo"是string的子类型);
    • FooEnum2 | number会被简化为number(因为数字枚举本身属于number范畴);
    • 最终FooInterface[keyof FooInterface]就合并成了string | number。
  3. 无基础类型时的特殊情况
    当接口仅包含枚举属性时,没有对应的父类型(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 08:33:31