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

如何用class-transformer转换Map中值为对象数组的类型?

解决Map<number, ValueType[]>的类型转换问题

直接使用@Type(() => ValueType)无法处理Map中值为数组的嵌套转换,因为@Type默认只能处理单层的对象或数组结构,无法遍历Map的键值对并转换数组内的元素。你需要通过@Transform注解自定义转换逻辑,手动处理Map的序列化与反序列化。

实现代码示例

首先确保你已导入class-transformer的相关工具:

import { Transform, plainToInstance } from 'class-transformer';

修改Demo类的someField属性,添加双向转换逻辑:

class ValueType {
  field1: number;
  field2: string;
}

class Demo {
  // 反序列化:将普通对象转为Map<number, ValueType[]>
  @Transform(({ value }) => {
    const map = new Map<number, ValueType[]>();
    Object.entries(value).forEach(([key, items]) => {
      // 把字符串键转为number,同时将数组内的每个对象转为ValueType实例
      map.set(Number(key), plainToInstance(ValueType, items as unknown[]));
    });
    return map;
  }, { toClassOnly: true })

  // 序列化:将Map转为普通对象,方便JSON处理
  @Transform(({ value }) => {
    const result: Record<string, ValueType[]> = {};
    value.forEach((items, key) => {
      result[key.toString()] = items;
    });
    return result;
  }, { toPlainOnly: true })
  
  someField: Map<number, ValueType[]>;
}

使用示例

将普通JSON对象转换为Demo实例:

const plainData = {
  someField: {
    "1": [{ field1: 1, field2: "test1" }, { field1: 2, field2: "test2" }],
    "2": [{ field1: 3, field2: "test3" }]
  }
};

const demoInstance = plainToInstance(Demo, plainData);
// 此时demoInstance.someField为Map类型,数组内的元素都是ValueType实例

关键说明

  • toClassOnly:仅在将普通对象转为类实例时执行该转换逻辑
  • toPlainOnly:仅在将类实例转为普通对象(比如序列化JSON)时执行该转换逻辑
  • 手动遍历Map的键值对,确保每个数组元素都被转换为ValueType实例,同时处理Map键的类型转换(JSON中键默认是字符串,需转为number)

内容的提问来源于stack exchange,提问作者Nitin Goyal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 11:17:11