如何从类的属性值创建TypeScript联合类型?
实现方案
要从类的属性值中创建对应的联合类型,需要分两步操作:
1. 保留属性值的字面量类型
TypeScript 默认会把对象中的字符串值拓宽为 string 类型,所以首先要确保类的属性值被识别为具体的字面量类型。可以通过 as const 断言实现:
class Names { parents = { mother: "Susan", dad: "Mike" } as const; children = { son: "Peter" } as const; }
2. 提取并合并值类型
通过 TypeScript 的类型操作符,提取类实例属性的所有值类型并合并为联合类型:
// 获取Names类的实例类型 type NamesInstance = InstanceType<typeof Names>; // 提取parents对象的所有值类型 type ParentsValues = NamesInstance["parents"][keyof NamesInstance["parents"]]; // 提取children对象的所有值类型 type ChildrenValues = NamesInstance["children"][keyof NamesInstance["children"]]; // 合并为最终的联合类型 type NamesICanUse = ParentsValues | ChildrenValues; // 类型为 "Susan" | "Mike" | "Peter"
简化写法
如果想简化代码,可以将类型定义合并为一行:
type NamesICanUse = (InstanceType<typeof Names>["parents"] | InstanceType<typeof Names>["children"])[keyof (InstanceType<typeof Names>["parents"] | InstanceType<typeof Names>["children"])];
内容的提问来源于stack exchange,提问作者Lars Flieger
相关产品推荐
相关产品推荐

