Inferência de tipos

Três mecanismos automáticos: interfaces viram inline schema, class-validator vira JSON Schema, @HttpCode() vira o status certo.

Interface-typed DTOs

Quando um response ou body type é uma interface do TypeScript (não uma classe), o Swagger não pode usá-la como valor type: porque interfaces são apagadas em runtime. O nestjs-docfy detecta isso automaticamente e gera um objeto schema: inline, sem mudanças no seu código.

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

Output gerado:

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

Suporta: primitivos, nullable unions (T | null), arrays, interfaces aninhadas e propriedades opcionais (excluídas de required).

class-validator inference

Quando uma classe DTO usa decorators class-validator e não já tem @ApiProperty nas propriedades, o nestjs-docfy infere um JSON Schema completo a partir dos decorators de validação, sem necessidade de anotação manual.

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;
}

Output gerado:

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

Decorators suportados

Decorator
@IsString
@IsEmail
@IsUrl
@IsUUID
@IsDateString
@IsNumber
@IsInt
@IsBoolean
@IsArray
@Min
@Max
@MinLength
@MaxLength
@IsOptional
Preservação de anotações existentes

Se qualquer propriedade da classe já tiver @ApiProperty, a inferência é pulada e type: ClassName é usado; suas anotações Swagger existentes nunca são sobrescritas.

@HttpCode() support

O decorator @HttpCode() do NestJS sobrescreve o código HTTP default para um route handler. O nestjs-docfy lê ele automaticamente e usa o código correto no ApiResponse gerado.

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

Output gerado:

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

Sem @HttpCode(), os códigos default se aplicam: 201 para @Post, 200 para todos os outros verbos HTTP.