TypeScript纯类型层面如何遍历字典类型批量转换属性值?
实现方案说明
这个需求完全可以在TypeScript纯类型层面实现,核心依靠TypeScript原生的映射类型能力完成逐属性遍历转换,完全不需要手动逐属性编写逻辑,适配动态生成属性的业务场景。
核心实现逻辑
你伪代码中"遍历对象每个属性、逐属性做类型转换"的需求,TypeScript有成熟的标准语法支持:
- 通过
keyof T获取输入对象类型的所有已知属性键 - 通过
[K in keyof T]遍历每一个属性键 - 对每个键对应的原始属性值,调用你已经实现的
GetClassParameterForAlphaBeta工具类型完成泛型参数提取
转换结果会完全保留原对象的属性结构、可选/只读修饰符,和手写逐属性定义的类型精度完全一致。
修正后的完整代码
你之前定义的Store类型带有字符串索引签名,会抹平原有对象的精确属性信息,建议调整约束后实现,兼容动态生成的属性结构:
class Alpha<T> { private a: T; } class Beta<T> { private b: T; } // 保留你已实现的泛型参数提取逻辑 type GetClassParameterForAlphaBeta<T extends Alpha<any> | Beta<any>> = T extends Alpha<infer R> ? R : T extends Beta<infer R> ? R : unknown; // 替换伪代码的正式类型实现 type GetStoreData<T> = { [K in keyof T]: T[K] extends Alpha<any> | Beta<any> ? GetClassParameterForAlphaBeta<T[K]> : T[K] }; type Data = {a: Alpha<number>; b: Beta<string>; c: Alpha<string> }; type x = GetStoreData<Data> // 推导结果完全匹配预期:{a: number; b: string; c: string}
细节说明
- 所有转换逻辑完全运行在纯类型层面,没有任何运行时代码开销
- 自动适配动态生成的属性结构,无论输入的对象类型有多少个确定的有限属性,都能自动完成逐属性转换,不需要维护额外的属性列表
- 自动保留原属性的修饰特征:如果原属性是可选的、只读的,转换后的类型会完整保留这些修饰,不会出现类型精度丢失
- 加入的属性类型判断逻辑可以避免非
Alpha/Beta类型的属性触发编译报错,适配更通用的业务场景
内容的提问来源于stack exchange,提问作者Maciej Kravchyk
相关产品推荐
相关产品推荐

