メインコンテンツへスキップ
ブログ一覧に戻る
バックエンド開発

TypeScriptとZodによる型安全なAPIの構築

2023年11月28日
9分で読めます
TypeScriptとZodによる型安全なAPIの構築

この記事の結論

TypeScriptとZodを組み合わせて、実行時も型安全性を担保したREST APIの実装テクニックを解説します。

TypeScriptとZodによる型安全なAPIの構築

TypeScriptとZodを組み合わせて、実行時も型安全性を担保したREST APIの実装テクニックを解説します。

はじめに

API開発において、型安全性は非常に重要です。TypeScriptはコンパイル時の型チェックを提供しますが、実行時のデータ検証も必要です。Zodを使用することで、TypeScriptの型安全性と実行時のバリデーションを統合できます。

Zodとは

Zodは、TypeScriptファーストのスキーマバリデーションライブラリです。主な特徴は以下の通りです:

  • 型推論: スキーマからTypeScriptの型を自動生成
  • 実行時バリデーション: データの検証を実行時に行う
  • エラーハンドリング: 詳細なエラーメッセージを提供

基本的な使い方

スキーマの定義

import { z } from 'zod'

const UserSchema = z.object({
  id: z.string().uuid(),
  email: z.string().email(),
  name: z.string().min(1),
  age: z.number().int().positive().optional(),
})

type User = z.infer<typeof UserSchema>

バリデーション

function validateUser(data: unknown): User {
  return UserSchema.parse(data)
}

APIエンドポイントでの活用

Next.js API Routeでの使用

import { NextRequest, NextResponse } from 'next/server'
import { z } from 'zod'

const CreateUserSchema = z.object({
  email: z.string().email(),
  name: z.string().min(1),
})

export async function POST(request: NextRequest) {
  try {
    const body = await request.json()
    const validatedData = CreateUserSchema.parse(body)
    
    // バリデーション済みのデータを使用
    const user = await createUser(validatedData)
    
    return NextResponse.json(user)
  } catch (error) {
    if (error instanceof z.ZodError) {
      return NextResponse.json(
        { error: 'Validation failed', details: error.errors },
        { status: 400 }
      )
    }
    return NextResponse.json(
      { error: 'Internal server error' },
      { status: 500 }
    )
  }
}

TypeScript×Zodで型安全なAPIを構築する要点

TypeScriptとZodを組み合わせることで、コンパイル時と実行時の両方で型安全性を担保できます。これにより、より堅牢なAPIを構築できます。

関連記事


ご相談・お問い合わせはこちら

次の一手

状況に合わせて、選んでください。