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

Typescript中如何用class-transformer初始化混合类型数组

问题解决方法:class-transformer混合类型数组转换方案

问题根因

@Type装饰器的设计逻辑是为属性指定统一的转换类型,当作用于数组属性时,仅会在解析数组的初始阶段调用1次,返回的类型会被应用到所有数组元素上,因此天然不支持混合类型数组的差异化转换。


解决方案:使用@Transform装饰器自定义元素转换逻辑

通过@Transform装饰器遍历数组的每一个元素,根据元素的特征判断其对应类型,再逐个执行转换,即可实现混合类型数组的正确实例化。

完整代码实现

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

// 基础类定义
class MetaViewDatalinked{
  id: string;
}

class MetaViewContainer{
  @Transform(({ value }) => {
    // value为children属性对应的原始plain对象数组
    return value.map(item => {
      // 根据类的独有属性判断类型,可根据实际业务调整判断规则
      if (item.children && Array.isArray(item.children)) {
        return plainToInstance(MetaViewContainer, item);
      }
      return plainToInstance(MetaViewDatalinked, item);
    })
  })
  children: (MetaViewDatalinked | MetaViewContainer)[];
}

使用示例

// 测试用混合类型JSON
const testJson = {
  children: [
    { id: 'link1' }, // MetaViewDatalinked类型
    { id: 'link2' }, // MetaViewDatalinked类型
    { 
      children: [
        { id: 'link3' },
        { children: [] }
      ]
    } // MetaViewContainer类型
  ]
};

// 执行转换
const instance = plainToInstance(MetaViewContainer, testJson);

注意事项

  • 类型判断的特征需要选择两个类的独有属性,避免出现误判,也可以替换为其他区分维度(比如自定义type标记字段)
  • 如果使用的是class-transformer v0.x版本,将代码中的plainToInstance替换为旧版的plainToClass即可,逻辑完全一致

内容的提问来源于stack exchange,提问作者Tech Wizard

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 09:45:06