Преобразование класса в класс / объект (Entity to DTO) в TypeScript и NestS - PullRequest
2 голосов
/ 09 февраля 2020

Как преобразовать объект базы данных User:

class User {
  public firstName: string;
  public lastName: string;
  public phone?: string;
  public email: string;
  public status: EUserState;
  public tokens: Token[];
  public password: string;
}

в объект DTO GetUserDTO:

class GetUserDTO {
  public id: number;
  public firstName: string;
  public lastName: string;
  public phone?: string;
  public email: string;
}

в TypeScript? Я использую пакеты @nestjs, class-validator и class-transformer, но я не нашел способа использовать их для достижения этой цели.

Кто-то может сказать, что наличие DTO для этого бессмысленно, но мы имеем DTO совместно используются сервером и клиентом для поддержки структуры API.

Есть идеи?

Ответы [ 2 ]

4 голосов
/ 10 февраля 2020

Есть несколько способов добиться того, что вы хотите

  1. Вы можете вручную сопоставить модели Domain с DTOs, используя функцию static из Domain или DTO
export class Domain {
   ...
   static toDTO(domain: Domain) {
      // mapping goes here
   }
}

или

export class Dto {
   ...
   static fromDomain(domain: Domain) {
      // mapping goes here
   }
}
Вы можете использовать стороннюю библиотеку: automapper-ts, @wufe/mapper, @nartc/automapper (моя библиотека) или morphism

class-transformer также можно считать mapper , однако, если вы хотите отобразить одну модель на другую, то class-transformer не может этого сделать.

0 голосов
/ 23 марта 2020

сначала измените Entity на обычный json, используя classToPlain класса-преобразователя

, затем измените обычный json на DTO, используя plainToClass класса-преобразователя, как показано ниже

  public async getAll(): Promise<ItemDTO[]> {
    return await this.repo.find()
      .then(items => items.map(e=>plainToClass(ItemDTO, classToPlain(e), { excludeExtraneousValues: true })));
  }

дополнительно, давайте использовать Исключить, Выставить преобразователь класса в DTO для данных клиента, которые вы хотите, чтобы клиент увидел.

@Exclude()
export class ItemDTO implements Readonly<ItemDTO> {
  @ApiProperty({ required: true })
  @IsUUID()
  @Expose()
  id: string;
}
...