如何基于普通对象的值生成TypeScript联合类型?
如何从对象属性值创建联合类型?
嘿,这个需求在TypeScript里完全可以实现,而且步骤很清晰,咱们来拆解一下:
首先,你需要确保TypeScript能精准识别对象里的每个属性值为字面量类型,而不是宽泛的string类型。默认情况下,TypeScript会把你的myObject推断成{ [key: number]: string },这样就没法提取具体的字符串值了。所以第一步要给对象加上as const断言,锁定它的类型:
const myObject = { 0: 'FIRST', 10: 'SECOND', 20: 'THIRD', } as const;
接下来,我们通过TypeScript的类型操作符来提取值的联合类型:
// 先获取对象的类型 type MyObjectType = typeof myObject; // 再获取对象所有键的联合类型 type MyObjectKeys = keyof MyObjectType; // 最后通过索引访问,得到所有值的联合类型 type AwesomeType = MyObjectType[MyObjectKeys];
当然,你也可以把这几步合并成一行,更简洁:
type AwesomeType = typeof myObject[keyof typeof myObject];
现在AwesomeType就完全等同于你想要的'FIRST' | 'SECOND' | 'THIRD'啦!
简单解释一下原理:
typeof myObject:获取myObject的具体类型(因为加了as const,所以是{ readonly 0: "FIRST"; readonly 10: "SECOND"; readonly 20: "THIRD"; })keyof typeof myObject:获取这个类型所有键的联合类型,也就是0 | 10 | 20typeof myObject[keyof typeof myObject]:用键的联合类型去索引对象类型,得到所有对应值的联合类型,也就是目标类型。
内容的提问来源于stack exchange,提问作者Marcio Pamplona
相关产品推荐
相关产品推荐

