Dev Study
NestJS コース

10. DTO — リクエストの形を定義する

DTO(Data Transfer Object)は、リクエストボディの形を表す専用クラスです。CreateUserDto のように「操作名 + Dto」という名前でクラスを作り、@Body() の型注釈に使います。インラインの型注釈と違い、ボディの形に名前が付いて再利用できるようになります。

実務では「1つの書き込み系エンドポイントに1つの DTO」を作るのが定番です。フロントエンドとの仕様のすり合わせも「この DTO の形で送ってください」と1ファイル見せれば済むため、API の入力仕様書としても機能します。

interface ではなく class で定義するのがポイントです。interface はコンパイル後に消えてしまいますが、class は実行時にも残るため、次のレッスンで学ぶ検証の仕組みが DTO を利用できるようになります。

サンプルコード(フレームワーク環境が必要なため表示のみ)

import { Body, Controller, Post } from "@nestjs/common";

// リクエストボディの形を表す専用クラス(= DTO)
export class CreateUserDto {
  name: string;
  age: number;
}

@Controller("users")
export class UsersController {
  @Post()
  create(@Body() dto: CreateUserDto) {
    // ボディの形が名前付きで明示される
    return { created: true, user: dto };
  }
}
公式ドキュメントで詳しく ↗