Tengo una clase con un miembro de propiedad de tipo matriz, un elemento de la matriz puede ser de varios tipos, por ejemplo, MetaViewDatalinked o MetaViewContainer, vea el ejemplo a continuación
class MetaViewContainer{ children: (MetaViewDatalinked | MetaViewContainer)[]; } class MetaViewDatalinked{ id: string; } Quiero usar class-transformer ( plainToClass(MetaViewContainer, json) ) para inicializar la clase con sus propiedades.
si tuviera una clase sin matriz, vea a continuación, usaría @Type
class MetaViewContainer{ @Type((typeHelpOptions: TypeHelpOptions) => { if (typeHelpOptions.object.container) return MetaViewContainer; return MetaViewDatalinked; }) child: MetaViewDatalinked | MetaViewContainer; } El problema es que @Type se llama solo una vez, independientemente del tipo de propiedad: una clase o una matriz de clases, creando así una matriz (en caso de que la propiedad sea una matriz) de un solo tipo.
Cualquier idea de cómo resolver el problema es realmente apreciada.
Resolví el problema usando el decorador @Transform
class MetaViewContainer{ @Transform((params: TransformFnParams) => { const children: (MetaViewDatalinked | MetaViewContainer)[] = []; if (!params.value) return children; if (Array.isArray(params.value)) { for (const item of params.value) { if (item.children) children.push(plainToClass(MetaViewContainer, item)); else children.push(plainToClass(MetaViewDatalinked, item)); } } return children; }) children: (MetaViewDatalinked | MetaViewContainer)[]; }