TypeScript如何实现Transform<T>将对象键值映射为指定包装类型
实现方案
第一步:定义类型映射字典与类型转换工具
// 统一维护类型映射规则,后续新增类型只需要扩展该对象即可 type TypeMap = { string: { "stringValue": string }, number: { "numberValue": number } } // 把原始类型映射为TypeMap的对应键 type TypeToKey<T> = T extends string ? "string" : T extends number ? "number" : never
第二步:实现Transform泛型
type Transform<T extends object> = { [Property in keyof T]: TypeMap[TypeToKey<T[Property]>] }
效果验证
type First = { a: string, b: number } // 转换后得到的Second类型完全符合需求 type Second = Transform<First> /* Second的实际类型为: { a: { "stringValue": string }, b: { "numberValue": number } } */
说明
之前使用typeof T做索引访问失败的原因是,typeof是值层面的运算符,不能直接作用于TypeScript的类型参数,类型层面的类型匹配需要通过条件类型实现。
该方案把所有映射规则收敛到了TypeMap中,后续需要新增boolean、数组等类型的映射时,只需要扩展TypeMap和TypeToKey的判断分支即可,不需要修改Transform的核心逻辑,可维护性远高于链式条件类型的实现。
内容的提问来源于stack exchange,提问作者David Min
相关产品推荐
相关产品推荐

