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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 01:20:41