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
相关产品推荐
相关产品推荐

