Class Transformer处理键值对类型属性(值为自定义类)的正确方法
Class Transformer处理索引类型属性的正确方式
问题根源:Class Transformer的@Type装饰器默认仅支持数组或直接的类实例属性转换,对于{[key: string]: ClassA}这种索引式对象属性,不会自动遍历每个值进行类型转换,导致b.z里的元素还是普通对象,无法调用sum()方法。
正确处理方式:使用@Transform装饰器手动转换每个键值对
通过@Transform自定义转换逻辑,遍历索引对象的所有属性,将每个值手动转换为ClassA实例:
import { Transform, plainToInstance } from 'class-transformer'; class ClassA { x: number; y: number; sum(): number { return this.x + this.y; } } class ClassB { @Transform(({ value }) => { const result: { [key: string]: ClassA } = {}; // 遍历原始对象的每个键值对,转换为ClassA实例 for (const key in value) { if (Object.prototype.hasOwnProperty.call(value, key)) { result[key] = plainToInstance(ClassA, value[key]); } } return result; }) z: { [key: string]: ClassA }; } // 测试代码 const plainObj = { z: { key1: { x: 1, y: 2 }, key2: { x: 10, y: 20 } } }; const b = plainToInstance(ClassB, plainObj); const s = b.z.key1.sum(); console.log(s); // 输出3
原理说明
@Transform装饰器接收一个转换函数,函数的value参数对应原始对象中z属性的值。我们遍历这个值的所有键,对每个子对象调用plainToInstance(ClassA, value[key]),将其转换为ClassA的实例,最终返回转换后的索引对象。这样b.z里的每个元素都是ClassA实例,就能正常调用sum()方法了。
内容的提问来源于stack exchange,提问作者Jeffrey Chen
相关产品推荐
相关产品推荐

