データベースエンティティ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を持っていることはこれには無意味であると言うことができますが、API構造を維持するためにサーバーとクライアント間でDTOを共有しています。
何か案は?
まず、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;
}