Menu
CoddyTech

DTOs

Parte de la sección TypeScript y NestJS del Journey de Node.js de Coddy. Lección 13 de 24.

@Body() body: { title: string } describe el cuerpo en un solo lugar, y nada lo comprueba: { "title": 42 } pasa directamente. Un DTO, un objeto de transferencia de datos, es una clase que describe qué contiene el cuerpo de una solicitud.

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

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

express? marca un campo opcional. El controlador y el servicio comparten la clase, así que coinciden en la estructura.

Un DTO es una clase, no una interfaz, por una razón. Las interfaces se eliminan junto con los demás tipos cuando se ejecuta el código, mientras que una clase sigue existiendo. La validación de Nest lee las reglas escritas como decoradores, y los decoradores necesitan una clase. Esa es la siguiente lección.

challenge icon

Desafío

Fácil

Ahora los clientes pueden crear una tarea que ya esté completada. Describe el cuerpo de POST /tasks con un DTO, una clase que enumera los campos que contiene el cuerpo de una solicitud, y pásalo hasta el servicio.

  1. En src/tasks/dto/create-task.dto.ts, dale a la clase CreateTaskDto dos campos: title, una cadena, y done, un booleano opcional.
  2. En src/tasks/tasks.controller.ts, cambia el método create. El parámetro @Body() ahora tiene el tipo CreateTaskDto en lugar de { title: string }. Pasa el DTO completo al servicio, no solo el título.
  3. En src/tasks/tasks.service.ts, cambia create para que reciba el DTO en lugar de un título. La nueva tarea obtiene su title del DTO y también su done, o false cuando el cuerpo no tiene done. El id y createdAt funcionan como antes.

Pruébalo: envía POST { "title": "Pay rent", "done": true } a /tasks. Obtendrás 201 y la nueva tarea, completada:

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

(createdAt muestra la hora de tu solicitud). Envía POST { "title": "Buy milk" }: obtendrás 201 con "done": false. Después, envía POST { "title": 42 }. Seguirás obteniendo 201 y se guardará "title": 42: el DTO describe el cuerpo, pero todavía no comprueba nada. En la próxima lección, Nest lo rechazará.

Pruébalo tú mismo

// Describe el cuerpo de POST /tasks: un título y done cuando el cliente lo envíe.
export class CreateTaskDto {}
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de TypeScript y NestJS

Practica por tu cuenta: Playground de Express