如何在TypeScript中使用AutoMapper?映射包及实现文档咨询
在TypeScript中使用对象映射工具(含AutoMapper)
嘿,关于TypeScript里的对象映射需求,我刚好有不少实践经验,来给你梳理清楚:
一、常用的对象映射包推荐
除了你关注的AutoMapper,这些工具包也各有优势,能覆盖不同场景的映射需求:
@automapper/core+@automapper/typescript:这是官方维护的TS版AutoMapper,和.NET生态的AutoMapper理念完全对齐,支持复杂嵌套映射、自定义转换规则、类型安全校验,是最贴近你需求的选择。class-transformer:原本主打类与JSON的序列化/反序列化,但也能轻松实现对象到对象的映射,常和class-validator搭配,适合需要同时做数据验证的场景。object-mapper:轻量级工具,基于JSON Schema定义映射规则,配置简单快速,适合小项目或简单映射场景。mapper-ts:专注于TS类型安全的映射工具,通过类型推导确保映射字段的正确性,对类型严格的项目非常友好。
如果遇到某些包文档不够详细的情况,直接去它们的GitHub仓库看examples文件夹就好——很多作者会放完整的实战示例,比文档更直观。
二、TypeScript中使用AutoMapper的具体步骤
以@automapper/core和@automapper/typescript为例,一步步实现对象映射:
1. 安装依赖
先在项目里安装必要的包:
npm install @automapper/core @automapper/typescript # 或者用yarn yarn add @automapper/core @automapper/typescript
2. 初始化Mapper实例
在项目入口文件或专门的映射配置文件中,创建全局可用的Mapper实例:
import { createMapper } from '@automapper/core'; import { classes } from '@automapper/typescript'; // 初始化Mapper,指定TS类的映射策略 const mapper = createMapper({ strategyInitializer: classes(), });
3. 定义源类和目标类
假设我们要把数据库实体User映射成API返回的UserDto:
// 源类:数据库实体 class User { id: number; firstName: string; lastName: string; age: number; } // 目标类:API数据传输对象 class UserDto { userId: number; fullName: string; userAge: number; }
4. 配置映射规则
通过createMap定义两个类的字段映射关系,支持自定义转换逻辑:
import { createMap, forMember, mapFrom } from '@automapper/core'; createMap( mapper, User, UserDto, // 重命名字段:User.id → UserDto.userId forMember( (dest) => dest.userId, mapFrom((src) => src.id) ), // 自定义转换:拼接firstName和lastName为fullName forMember( (dest) => dest.fullName, mapFrom((src) => `${src.firstName} ${src.lastName}`) ), // 重命名字段:User.age → UserDto.userAge forMember( (dest) => dest.userAge, mapFrom((src) => src.age) ) );
5. 执行映射
现在就可以用map方法完成单个对象的转换,用mapArray处理数组:
// 模拟从数据库获取的User实例 const user: User = { id: 1, firstName: 'John', lastName: 'Doe', age: 30, }; // 单个对象映射 const userDto = mapper.map(user, User, UserDto); console.log(userDto); // 输出:{ userId: 1, fullName: 'John Doe', userAge: 30 } // 数组对象映射 const users: User[] = [user, { id: 2, firstName: 'Jane', lastName: 'Smith', age: 28 }]; const userDtos = mapper.mapArray(users, User, UserDto);
进阶场景比如嵌套对象映射、全局转换规则、逆向映射等,都可以在GitHub仓库的示例中找到完整的实现代码。
内容的提问来源于stack exchange,提问作者Bhautik Dalicha
相关产品推荐
相关产品推荐

