web-dev-qa-db-ja.com

TypeScriptおよびNestSでクラスをクラス/オブジェクト(エンティティからDTO)に変換する

データベースエンティティ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で?使ってます @nestjsclass-validatorおよびclass-transformerパッケージですが、これを実現するためにそれらを使用する方法は見つかりませんでした。

誰かがDTOを持っていることはこれには無意味であると言うことができますが、API構造を維持するためにサーバーとクライアント間でDTOを共有しています。

何か案は?

5
Baterka

まず、class-transformerのclassToPlainを使用してEntityをプレーンなJSONに変更します

次に、以下のようにクラストランスフォーマーのplainToClassを使用して、プレーンなjsonをDTOに変更します

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

さらに、クライアントに表示させたいクライアントデータのDTOでExclude、Expose of class-transformerを使用してみましょう。

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