如何避免在每个 dto 中为 NestJs-swagger 编写“@ApiProperty()”

How to avoid to write `@ApiProperty()` in each dto for NestJs-swagger

我正在研究如何避免在每个 dto 中指定 @ApiProperty() 的方法。

我知道有一种方法可以创建文件 nest-cli.json,如果您在 nest-swagger 的控制器中指定 Promise<DTO>,它将从路由中生成输出 dto。

结构如下所示:

nest-cli.json

{
  "collection": "@nestjs/schematics",
  "sourceRoot": "src",
  "compilerOptions": {
    "plugins": [
      {
        "name": "@nestjs/swagger",
        "options": {
          "introspectComments": true
        }
      }
    ]
  }
}

controller.ts

@Get()
  async getMonitors (): Promise<OutputMonitorsDto> { // <-- Here is my outputDto
    return this.monitorsService.getMonitors()
  }

它大摇大摆地展示了这样的东西:

但是,有没有办法设置 NestJs 与 inputDTO 具有相同的东西,而不是在每个 dto 中写入 @ApiProperty

如下例所示:

ExampleDto.ts

export class GetListUsersDto {
  @ApiProperty()
  @IsString()
  name: string
  @ApiProperty()
  @IsString()
  email: string
  @ApiProperty()
  @IsString()
  publicApiKey: string
  @ApiProperty()
  @IsBoolean()
  isAdmin: boolean
  @ApiProperty()
  @IsBoolean()
  isDesigner: boolean
  @ApiProperty()
  @IsBoolean()
  isEditor: boolean
  @ApiProperty()
  @IsBoolean()
  isEnabled: boolean
  @ApiProperty()
  @IsString()
  boughtProduct: string
}

并且只有在@ApiProperty 之后它才会显示如上所示的结构,以便在 swagger 中输入。

装饰您的 DTO 属性是没有办法的。但是,如果您的 DTO 有很多共同点,您可能正在寻找 映射类型 。可以找到文档 here.

这些本质上允许您转换现有类型以保持 DTO 干燥。