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

