Гнездо JS> TypeORM Отображение сложных объектов в сложные DTO - PullRequest
0 голосов
/ 22 апреля 2020

Я использую класс-преобразователь> 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.

Есть ли способ сделать это или это ограничение метода ??

Спасибо

1 Ответ

1 голос
/ 22 апреля 2020

Вы должны указать вложенный тип с помощью @Type:

@Exclude()
export class ParentDTO{

  @Expose()
  pMember2 : string;

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

С помощью декоратора @Type преобразователь класса создает экземпляр класса для данного свойства при вызове plainToClass. В противном случае вложенное свойство останется простым javascript объектом и, следовательно, ваше @Exclude не будет использовано.

...