javascripttypescriptswaggernestjsnestjs-swagger

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


I'm researching the way on how to avoid to specify @ApiProperty() in each dto.

I know there is exist a way to create file nest-cli.json, and if you specify Promise<DTO> in your controller in nest-swagger it will produce the output dto from the route.

The structure looks like this:

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()
  }

And in swagger it shows something like this: enter image description here

However, is there any way to setup NestJs to have the same things with inputDTO and not to write in each dto @ApiProperty?

As in example below:

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
}

And only after @ApiProperty it will show the structure as shown above for input in swagger.


Solution

  • There is no way around decorating your DTO properties. However, if your DTOs have a lot in common, you might be looking for mapped types. Documentation can be found here.

    These essentially allow you to transform existing types to keep your DTOs DRY.