You need to enable JavaScript to run this app. TypeScript中如何基于对象取值自动生成对应联合类型
优惠活动
大模型
产品
解决方案
定价
更多

TypeScript中如何基于对象取值自动生成对应联合类型

TypeScript 提取对象值字面量联合类型的实现方法
  • 你当前的写法存在一个核心问题:给codeMap显式标注Record<string, number>的宽泛类型,会直接让TS丢失对对象内部具体字面量值的类型追踪,所有值都会被识别为通用的number类型,根本无法抽取出精确的1 | 2 | 3 | 4联合类型。

无额外校验需求的基础实现

  • 先调整常量定义,通过as const保留对象键和值的字面量类型,避免类型被TS自动拓宽:
const codeMap = {
  level1: 1,
  level2: 2,
  level3: 3,
  level4: 4,
} as const;

此时TS会为codeMap推断出精确的只读对象结构,不会把数值类型拓宽成宽泛的number。

  • 配合typeof操作符和TS的索引访问类型,一键提取所有值的联合类型:
type codeMapValues = typeof codeMap[keyof typeof codeMap];

最终得到的codeMapValues类型完全等价于1 | 2 | 3 | 4,全程不需要手动枚举对象内的取值。

需要保留结构校验的场景

如果业务上要求必须校验codeMap满足「字符串键对应数字值」的结构规则,不允许随意写入不符合要求的键值对,可以使用TS4.9以上版本提供的satisfies关键字,既完成结构校验,又不丢失字面量推断能力:

const codeMap = {
  level1: 1,
  level2: 2,
  level3: 3,
  level4: 4,
} as const satisfies Record<string, number>;

// 提取联合类型的逻辑完全不变
type codeMapValues = typeof codeMap[keyof typeof codeMap];

这种写法的优势是:如果误在对象里写入字符串值、不符合结构的键值对,TS会实时抛出类型错误;同时又不会因为标注了宽泛的Record<string, number>把值的类型拓宽成通用number,保证能拿到精确的字面量联合类型。


内容的提问来源于stack exchange,提问作者eatorres

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.04 11:24:03