如何在TypeScript中从对象创建字符串字面量联合类型?
问题
现有代码:
const FOO_TYPES={ FOO:'foo', FAA:'faa' }
希望通过这个对象程序化创建如下类型:
type FooTypes = "foo" | "faa"
让TypeScript在传入非指定值时抛出错误。之前使用过类似的类型定义:
type ObjectValues<T>=T[keyof T]
但这个类型仅匹配类型,不会检查允许的具体值。
解决方案
核心是让TypeScript保留对象属性的字面量类型,而非自动拓宽为string类型,具体步骤如下:
- 给原始对象添加
as const断言,锁定属性值的字面量类型:
const FOO_TYPES = { FOO: 'foo', FAA: 'faa' } as const;
- 复用你定义的
ObjectValues类型:
type ObjectValues<T> = T[keyof T];
- 生成目标联合类型:
type FooTypes = ObjectValues<typeof FOO_TYPES>;
此时FooTypes的类型就是"foo" | "faa",当传入非这两个值的参数时,TypeScript会直接抛出类型错误。
原因说明
之前的写法无效,是因为TypeScript默认会把对象中的字符串属性值自动拓宽为string类型,导致ObjectValues<typeof FOO_TYPES>最终得到的是string类型,而非具体的字面量联合。as const断言会强制TS将对象的每个属性值视为不可变的字面量,这样keyof T对应的属性值就能被准确提取为联合类型。
内容的提问来源于stack exchange,提问作者Guer0157
相关产品推荐
相关产品推荐

