TypeScript中能否将对象拆分为其属性构成的联合类型?
TypeScript 对象类型拆分为单属性联合类型
我有如下对象:
const obj ={ list: ["Example1", "Example2"], settings: {isEnabled: true, version: "v1.1"}, extra: {1: "", 2: "", 3: ""} }
我希望将obj的类型拆分为其属性构成的联合类型,即每个类型只包含原对象的一个属性:
type ObjType = typeof obj; type Expected = {list: Array<string>} | {settings: {isEnabled: boolean, version: string}} | {extra: {1: string, 2: string, 3: string}};
请问这是否可行?
我的尝试
我尝试了以下写法,但无法实现预期效果,我知道需要递归,但不知道具体怎么写:
// 这个写法不行,我想知道怎么引入递归 type Split<T extends {}> = [keyof T] extends [c: infer C1, ...rest: infer C2] ? C1 | C2 : "1"; type Split1<T extends {}> = [keyof T] extends (infer C1 | infer C2) ? {[C1]: any} | {[C2]: any} : "1"; type result = Split<ObjType>; type result1 = Split1<ObjType>;
解决方案
可行,不需要复杂递归,利用映射类型和索引访问类型就能实现。核心思路是先把每个属性映射为仅包含该属性的对象类型,再提取这些类型的联合。
实现代码:
const obj = { list: ["Example1", "Example2"], settings: { isEnabled: true, version: "v1.1" }, extra: { 1: "", 2: "", 3: "" } }; type ObjType = typeof obj; // 核心类型:将对象拆分为单属性联合类型 type SplitObject<T extends object> = { [K in keyof T]: { [P in K]: T[P] } }[keyof T]; type Expected = SplitObject<ObjType>;
逻辑解释
- 第一步
{ [K in keyof T]: { [P in K]: T[P] } }:创建一个映射类型,原对象的每个属性K都会被转换为一个仅包含K属性的对象类型,值类型完全继承原对象对应属性的类型。 - 第二步
[keyof T]:通过索引访问映射类型的所有值,自动将这些单属性对象类型合并为联合类型,得到最终需要的结果。
内容的提问来源于stack exchange,提问作者Sonny D
相关产品推荐
相关产品推荐

