NestJS > TypeORM 将复杂实体映射到复杂的 DTO

NestJS > TypeORM Mapping complex entities to complex DTOs

我正在使用 class-transformer > plainToClass(entity, 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 类型。

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

谢谢

您必须使用 @Type:

指定嵌套类型
@Exclude()
export class ParentDTO{

  @Expose()
  pMember2 : string;

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

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