2

我使用 class-transformer > plainToClass(entity, DTO) 将实体映射到 DTO

我还实现了此处描述的关联 transform.interceptor 模式。

然后我@Expose()在我的 DTO 成员上使用。这很好用,但我有一个限制,我需要在我的父 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 类型。

有没有办法做到这一点,或者这是方法的限制?

谢谢

4

1 回答 1

3

您必须指定嵌套类型@Type

@Exclude()
export class ParentDTO{

  @Expose()
  pMember2 : string;

  @Expose()
  @Type(() => ChildDto)
  pMember2 : ChildDto[];
}

使用@Type装饰器,类转换器在plainToClass调用时为给定属性实例化一个类。否则,嵌套属性将保持一个普通的 javascript 对象,因此@Exclude不会使用您的。

于 2020-04-22T16:42:19.423 回答