如何在TypeScript中手动映射复杂对象属性(类C# AutoMapper)
实现类似AutoMapper的对象映射(IClassA转IClassB)
方案一:手动实现(无第三方依赖)
不想引入额外库的话,用对象解构和扩展运算符就能快速搞定,自动复用所有属性名/类型一致的字段,只单独处理差异项:
先定义类型(TypeScript环境,JS环境可跳过):
interface IClassA { attribute1: string; attribute2: boolean; attribute3: number; // 其他共同属性... } interface IClassB { attribute1: string; attribute2: boolean; attr3: string; // 其他共同属性... }
编写映射函数:
function mapClassAToClassB(obj1: IClassA): IClassB { // 解构出需要特殊处理的属性,剩余属性用rest统一收集 const { attribute3, ...commonProps } = obj1; // 合并通用属性和转换后的差异属性 return { ...commonProps, attr3: attribute3.toString() }; } // 使用示例 const obj1: IClassA = { attribute1: "demo", attribute2: false, attribute3: 456 }; const obj2: IClassB = mapClassAToClassB(obj1);
这种方式简洁高效,后续如果新增差异属性,只需要在解构和返回对象中添加对应处理逻辑即可。
方案二:使用第三方映射库(接近AutoMapper体验)
如果需要更接近C# AutoMapper的配置式映射,推荐用automapper-ts,适合复杂场景或大量映射需求:
- 安装依赖:
npm install automapper-ts --save
- 配置映射规则并使用:
import { createMap, forMember, mapFrom, Mapper } from 'automapper-ts'; // 初始化映射器 const mapper = new Mapper(); // 定义IClassA到IClassB的映射规则 createMap(mapper, IClassA, IClassB) // 手动指定attr3的映射来源:取IClassA的attribute3并转为字符串 .forMember('attr3', mapFrom(src => src.attribute3.toString())); // 执行映射 const obj2: IClassB = mapper.map(obj1, IClassA, IClassB);
这种方式的优势是映射规则集中配置,可复用性强,遇到嵌套对象映射时也能通过配置自动处理,维护成本更低。
注意事项
- JavaScript环境下无需接口定义,直接操作对象即可;
- 如果存在多层嵌套的复杂对象,手动实现需要递归处理嵌套字段,第三方库通常支持嵌套映射的自动配置。
内容的提问来源于stack exchange,提问作者ozziem
相关产品推荐
相关产品推荐

