我正在使用class-transformer> plainToClass
(实体,DTO)将实体映射到DTO的
我还实现了here中描述的关联的transform.interceptor模式。
然后,我在DTO的成员上使用@Expose()
。这很好用,但是我有一个限制,我需要在我的父DTO中映射成员DTO,但这没有发生,请参见下面的简单示例
@Exclude()
export class ParentDTO{
@Expose()
pMember2 : string;
@Expose()
pMember2 : ChildDto[];
}
@Exclude()
export class ChildDTO{
@Expose()
cMember2 : string;
}
export class ParentEntity{
pMember1 : number;
pMember2 : string;
pMember3 : string;
pMember4
: Child[];
}
export class ChildEntity{
cMember1 : number;
cMember2 : string;
cMember3 : string;
}
现在,如果我运行plainToClass(parentEntityFromDB, ParentDTO)
,我希望得到以下信息
ParentDTO{
pMember2 : string;
pMember2 : ChildDto[];
}
但是,我得到的是
ParentDTO{
pMember2 : string;
pMember2 : Child[]; //Including all original members
}
基本上plainToClass(entity,DTO)不会自动映射成员以匹配给定的DTO类型。
有没有办法做到这一点,或者这是方法的局限性?
谢谢
答案 0 :(得分:1)
您必须使用@Type
指定嵌套类型:
@Exclude()
export class ParentDTO{
@Expose()
pMember2 : string;
@Expose()
@Type(() => ChildDto)
pMember2 : ChildDto[];
}
使用@Type
装饰器,类转换器在调用plainToClass
时为给定属性实例化一个类。否则,嵌套属性将保留为纯JavaScript对象,因此不会使用您的@Exclude
。