Zod

ゾッド

Zod(ゾッド)を分かりやすく

Zod は、TypeScript のためのスキーマ検証ライブラリです。型安全なデータ検証を実現し、Next.js の API エンドポイントで利用することで、型安全を保証しながらデータを扱うことができます。データの検証を行う際には、型の予測不可能性や型エラーを防ぐために Zod を使用します。

Zod のインストール

Zod をプロジェクトに追加するには、以下のコマンドを実行します。

npm install zod

Zod スキーマの作成

まず、Zod スキーマを作成することで、データ構造を定義します。例えば、ユーザー情報を表すスキーマを作成する場合、以下のように記述します。

import { z } from 'zod'

const userSchema = z.object({
  id: z.number(),
  name: z.string(),
  email: z.string().email(),
  age: z.number().int().min(0),
})

このスキーマでは、id が数値、name が文字列、email が E メール形式の文字列、age が 0 以上の整数であることを定義しています。

API エンドポイントでの Zod の使用

次に、Next.js の API エンドポイントで Zod を使ってデータ検証を行います。ここでは、ユーザー情報の登録を行う API エンドポイントを作成する例を示します。

まず、pages/api/users.ts ファイルを作成し、以下のように記述します。

import { NextApiRequest, NextApiResponse } from 'next'
import { z } from 'zod'

const userSchema = z.object({
  id: z.number(),
  name: z.string(),
  email: z.string().email(),
  age: z.number().int().min(0),
})

export default async (req: NextApiRequest, res: NextApiResponse) => {
  if (req.method === 'POST') {
    try {
      const user = userSchema.parse(req.body)
      // データベースへの保存処理など
      res.status(201).json({ message: 'User created successfully', user })
    } catch (error) {
      if (error instanceof z.ZodError) {
        res.status(400).json({ message: 'Invalid data', errors: error.errors })
      } else {
        res.status(500).json({ message: 'Internal server error' })
      }
    }
  } else {
    res.status(405).json({ message: 'Method not allowed' })
  }
}

上記のコードでは、リクエストメソッドが POST の場合に、userSchema.parse(req.body) を使用してリクエストボディのデータ検証を行います。データがスキーマに従っていれば、データベースへの保存処理などを行い、正常に登録されたことを示すレスポンスを返します。

もし検証に失敗した場合、z.ZodError がスローされ、エラーレスポンスを返します。また、それ以外のエラーが発生した場合は、内部サーバーエラーを示すレスポンスを返します。

Zod を利用した型の自動生成

Zod を使用することで、スキーマから TypeScript の型を自動生成することができます。これにより、API エンドポイントで返すデータの型を一元管理することができ、型の整合性を保つことができます。

例として、先ほどのユーザー情報のスキーマから型を生成する場合、以下のように記述します。

import { z } from 'zod'

const userSchema = z.object({
  id: z.number(),
  name: z.string(),
  email: z.string().email(),
  age: z.number().int().min(0),
})

export type User = z.infer<typeof userSchema>

これにより、User 型が自動的に生成され、userSchema に従ったデータ構造を持つことが保証されます。API エンドポイントで返すデータの型として使用することで、型の整合性を維持できます。

まとめ

Zod を Next.js と TypeScript のソースコードに組み込むことで、型安全なデータ検証を実現できます。また、スキーマから TypeScript の型を自動生成する機能を利用することで、API エンドポイントで返すデータの型の整合性を保つことができます。

このように、Zod を活用することで、Next.js と TypeScript を用いたプロジェクトにおいて、型安全性を高めることができます。