Menu
CoddyTech

DTOs

Parte da seção TypeScript e NestJS do Journey de Node.js da Coddy. Lição 13 de 24.

@Body() body: { title: string } descreve o corpo em um único lugar, e nada o verifica: { "title": 42 } passa diretamente. Um DTO, um objeto de transferência de dados, é uma classe que descreve o que o corpo de uma solicitação contém.

export class CreateOrderDto {
    customer: string;
    express?: boolean;
}

@Post()
create(@Body() dto: CreateOrderDto) {
    return this.ordersService.create(dto);
}

express? marca um campo opcional. O controlador e o serviço compartilham a classe, então concordam sobre a estrutura.

Um DTO é uma classe, não uma interface, por um motivo. As interfaces são removidas junto com os outros tipos quando o código é executado, enquanto uma classe continua existindo. A validação do Nest lê regras escritas como decoradores, e os decoradores precisam de uma classe. Essa é a próxima lição.

challenge icon

Desafio

Fácil

Agora os clientes podem criar uma tarefa que já esteja concluída. Descreva o corpo de POST /tasks com um DTO, uma classe que lista os campos contidos no corpo de uma solicitação, e passe-o até o serviço.

  1. Em src/tasks/dto/create-task.dto.ts, dê à classe CreateTaskDto dois campos: title, uma string, e done, um booleano opcional.
  2. Em src/tasks/tasks.controller.ts, altere o método create. O parâmetro @Body() agora tem o tipo CreateTaskDto em vez de { title: string }. Passe o DTO inteiro para o serviço, não apenas o título.
  3. Em src/tasks/tasks.service.ts, altere create para receber o DTO em vez de um título. A nova tarefa obtém seu title do DTO e também seu done, ou false quando o corpo não tiver done. O id e createdAt funcionam como antes.

Experimente: envie por POST { "title": "Pay rent", "done": true } para /tasks. Você recebe 201 e a nova tarefa, concluída:

{ "id": 4, "title": "Pay rent", "done": true, "createdAt": "2026-10-30T09:15:00.000Z" }

(createdAt mostra o horário da sua solicitação.) Envie por POST { "title": "Buy milk" }: 201 com "done": false. Em seguida, envie por POST { "title": 42 }. Você ainda recebe 201, com "title": 42 salvo: o DTO descreve o corpo, mas ainda não verifica nada. A próxima lição fará o Nest recusá-lo.

Experimente você mesmo

// Descreva o corpo de POST /tasks: um título e done quando o cliente o enviar.
export class CreateTaskDto {}
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de TypeScript e NestJS

Pratique por conta própria: Playground de Express