如何用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
相关产品推荐
相关产品推荐

