TypeScript映射类型:能否将多属性对象转单属性对象联合类型?
TypeScript 对象类型转单属性对象联合类型实现
结论
可以实现该类型转换,依托TypeScript原生映射类型+索引访问特性即可完成,无需额外复杂类型依赖。
具体实现
首先定义通用转换工具类型:
type ToSinglePropUnion<T> = { [K in keyof T]: { [P in K]: T[P] } }[keyof T]
针对示例的使用方式如下,转换结果完全匹配目标类型:
type input = { a: 1; b: 2; c: 3; }; type output = ToSinglePropUnion<input>; // 等价于 type output = { a: 1 } | { b: 2 } | { c: 3 }
可通过以下代码验证类型正确性:
// 符合约束,编译正常通过 const valid1: output = { a: 1 }; const valid2: output = { b: 2 }; const valid3: output = { c: 3 }; // 不符合约束,TS会抛出类型错误 // const invalid1: output = { a: 1, b: 2 }; // const invalid2: output = { d: 4 };
实现逻辑
- 映射类型语法
[K in keyof T]会遍历入参类型T的所有键,为每个键单独生成对应的映射值类型 - 遍历到单个键K时,构造的映射值为仅包含K这一个属性的对象,属性值类型和原类型T中K对应的类型完全一致
- 最终通过
[keyof T]索引访问前面构造的映射类型,会取出该映射类型下所有属性的值类型,自动合并为联合类型,正好匹配目标输出结构
内容的提问来源于stack exchange,提问作者Andrey Kislov
相关产品推荐
相关产品推荐

