Вывод типов

Три автоматических механизма: интерфейсы превращаются во встроенную схему, class-validator в JSON Schema, @HttpCode() в правильный статус.

DTO с типом-интерфейсом

Когда тип ответа или тела запроса задан через interface в TypeScript, а не через класс, Swagger не может подставить его в type:, потому что интерфейсы стираются в рантайме. nestjs-docfy замечает это сам и генерирует встроенный объект schema:, без единой правки в вашем коде.

Sua interface
// Your existing interface (no need to convert to a class)
export interface RegisterResponseDto {
  success: boolean;
  message: string | null;
}

Что получается:

Generated
ApiResponse({
  status: 201,
  description: 'Created',
  schema: {
    type: 'object',
    properties: {
      success: { type: 'boolean' },
      message: { type: 'string', nullable: true },
    },
    required: ['success'],
  },
}),

Поддерживаются: примитивы, объединения с null (T | null), массивы, вложенные интерфейсы и необязательные свойства (в required они не попадают).

Вывод из class-validator

Когда класс DTO размечен декораторами class-validator и при этом у его свойств нет @ApiProperty, nestjs-docfy выводит полноценную JSON Schema прямо из декораторов валидации. Размечать руками ничего не нужно.

create-user.dto.ts
// create-user.dto.ts
import { IsString, IsEmail, MinLength, IsOptional } from 'class-validator';

export class CreateUserDto {
  @IsString()
  @MinLength(2)
  name: string;

  @IsEmail()
  email: string;

  @IsOptional()
  @IsString()
  bio?: string;
}

Что получается:

ts
ApiBody({
  schema: {
    type: 'object',
    properties: {
      name:  { type: 'string', minLength: 2 },
      email: { type: 'string', format: 'email' },
      bio:   { type: 'string' },
    },
    required: ['name', 'email'],
  },
}),

Поддерживаемые декораторы

Decorator
@IsString
@IsEmail
@IsUrl
@IsUUID
@IsDateString
@IsNumber
@IsInt
@IsBoolean
@IsArray
@Min
@Max
@MinLength
@MaxLength
@IsOptional
Существующая разметка сохраняется

Если хотя бы у одного свойства класса уже стоит @ApiProperty, вывод пропускается и подставляется type: ClassName. Вашу разметку Swagger никто не перезапишет.

Поддержка @HttpCode()

Декоратор @HttpCode() из NestJS переопределяет код ответа по умолчанию для обработчика маршрута. nestjs-docfy читает его сам и подставляет верный код в сгенерированный ApiResponse.

users.controller.ts
// users.controller.ts
@Post('logout')
@HttpCode(204)
logout(): void { ... }

Что получается:

ts
logout: [
  ApiOperation({ summary: 'Logout' }),
  ApiResponse({ status: 204, description: 'No Content' }),
],

Без @HttpCode() действуют коды по умолчанию: 201 для @Post и 200 для всех остальных HTTP-методов.