在 TypeScript 和 NestS 中将类转换为类/对象(实体到 DTO)

Bat*_*rka 11 typescript class-validator nestjs class-transformer

如何转换数据库实体User

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

Run Code Online (Sandbox Code Playgroud)

进入 DTO 实体GetUserDTO

class GetUserDTO {
  public id: number;
  public firstName: string;
  public lastName: string;
  public phone?: string;
  public email: string;
}
Run Code Online (Sandbox Code Playgroud)

在打字稿中?我正在使用@nestjs,class-validatorclass-transformer包,但我没有找到任何方法来使用它们来实现这一目标。

有人可能会说,拥有 DTO 对此毫无意义,但我们在服务器和客户端之间共享 DTO 以维护 API 结构。

有任何想法吗?

Cha*_*ran 13

有几种方法可以实现您想要的

  1. 您可以手动从Domain模型映射到DTOs使用static函数DomainDTO
export class Domain {
   ...
   static toDTO(domain: Domain) {
      // mapping goes here
   }
}
Run Code Online (Sandbox Code Playgroud)

或者

export class Dto {
   ...
   static fromDomain(domain: Domain) {
      // mapping goes here
   }
}
Run Code Online (Sandbox Code Playgroud)
  1. 您可以使用第三方库:automapper-ts@wufe/mapper@nartc/automapper(我的LIB),或morphism

class-transformer也可以被视为mapper,但是,如果您想从一个模型映射到另一个模型,那么class-transformer就不能真正做到这一点。

  • 在干净的架构中,域不应该依赖于基础设施层,这意味着Domain类不应该知道DTO类。因此第二个选项“Dto.fromDomain”应该是首选。 (11认同)