Typescript两个复杂类双向映射实现方案咨询
适配方案推荐
工具方案
1. @automapper/*(TypeScript版对象映射库
这个工具的设计思路和Java生态的MapStruct高度相似,非常适合有Java/Scala技术栈背景的开发者使用,能力覆盖你提到的全部需求,比class-transformer的自定义映射能力更灵活:
- 支持配置字段名自定义映射、嵌套结构映射、双向映射、自定义类型转换、数组扁平化/组装逻辑,硬编码量极低,映射规则一次配置可双向复用。
使用示例:
// 初始化mapper实例 const mapper = createMapper({ strategyInitializer: classes(), }); // 配置A到B的映射规则 mapper.createMap(A, B) // 字段名+类型转换 .forMember(dest => dest.newKey1, mapFrom(src => Number(src.key1))) // 字符串转日期 .forMember(dest => dest.newKey3, mapFrom(src => new Date(src.key3))) // 嵌套字段映射 .forMember(dest => dest.key4.key5, mapFrom(src => src.key5)) // 一键配置反向映射(B转A) .reverseMap(); // 转换调用 const bInstance = mapper.map(aInstance, A, B); const aInstance = mapper.map(bInstance, B, A);
2. Zod Schema驱动映射
如果你的场景需要同时做类型校验和转换,可以用Zod定义两个类的结构Schema,再配套写转换逻辑,类型安全性更高,和Scala的Case Class Schema校验逻辑类似:
// 定义A、B的结构Schema const ASchema = z.record(z.string()); const BSchema = z.object({ newKey1: z.number(), newKey2: z.string(), newKey3: z.date(), key4: z.object({ key5: z.string() }) }); // A转B转换函数 const aToB = (a: z.infer<typeof ASchema>): z.infer<typeof BSchema> => { return { newKey1: Number(a.key1), newKey2: a.key2, newKey3: new Date(a.key3), key4: { key5: a.key5 } } } // B转A同理实现即可
轻量无依赖实现思路
如果不想引入额外依赖,可以自己实现通用映射工具:
- 提前定义统一格式的映射规则配置,支持直接字段名映射、自定义转换函数、嵌套路径赋值、数组转换逻辑
- 编写通用转换函数,遍历映射规则自动处理字段赋值、类型转换,一次编写可复用所有映射场景
- 数组扁平化需求只需要在转换规则中编写对应的数组处理逻辑即可实现。
内容的提问来源于stack exchange,提问作者user134
相关产品推荐
相关产品推荐

