I have class with a property member of type array, an item in the array can be of several types for example MetaViewDatalinked or MetaViewContainer, see example below
class MetaViewContainer{
children: (MetaViewDatalinked | MetaViewContainer)[];
}
class MetaViewDatalinked{
id: string;
}
I want to use class-transformer (plainToClass(MetaViewContainer, json)) to initialize the class with its properties.
if I had class without array see below, I would use @Type
class MetaViewContainer{
@Type((typeHelpOptions: TypeHelpOptions) => {
if (typeHelpOptions.object.container)
return MetaViewContainer;
return MetaViewDatalinked;
})
child: MetaViewDatalinked | MetaViewContainer;
}
The issue is @Type is called only once regardless of the property's type: a class or an array of classes, thus creating an array (in case of property being array) of single type.
Any ideas how to solve the issue are really appreciated.
I solved the issue with using @Transform decorator
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)[];
}