You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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,适合复杂场景或大量映射需求:

  1. 安装依赖:
npm install automapper-ts --save
  1. 配置映射规则并使用:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 18:55:29