0Pricing
TypeScript Academy · レッスン

zodによるスキーマ検証とTSへの推論

zodでリクエストを検証し、スキーマからTypeScriptの型を推論し、安全なミドルウェアとエラー処理を追加します

「zodによるスキーマ検証とTSへの推論」はCoddyKit上の無料TypeScript Academyレッスンです。 これはレッスン2/3です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはTypeScript Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 TypeScript Academyコースには全3レッスンが含まれています。

導入

目標: zod で受信データを検証し、z.infer によって TypeScript の型との同期を保ちます。安全にパースし、分かりやすいエラーを返し、バリデーションをミドルウェアに組み込みます。

  • スキーマを一度だけ定義する
  • TS の型を推論する
  • safeParse と 400 エラー

スキーマと infer

zod で一度だけモデル化します。導出された type User = z.infer<typeof userSchema> は、バリデーションを正確に反映します。

import { z } from "zod"

export const userSchema = z.object({
  id: z.string().regex(/^u_[a-z0-9]+$/),
  name: z.string().min(1),
  age: z.number().int().nonnegative().optional()
})

export type User = z.infer<typeof userSchema>

// Reuse `User` across handlers, services, and tests

ハンドラーで safeParse を使う

safeParse を使って例外を避け、整形した問題情報とともに 400 を返します。レスポンス型には、成功時とエラー時の両方の形状が反映されます。

import { Request, Response } from "express"
import { userSchema, User } from "./schema"

export function createUser(req: Request<{}, User, unknown>, res: Response<User | { error: string; issues?: unknown }>) {
  const parsed = userSchema.safeParse(req.body)
  if (!parsed.success) {
    return res.status(400).json({ error: "Invalid body", issues: parsed.error.format() })
  }
  const user = parsed.data
  return res.status(201).json(user)
}

ミドルウェアヘルパー

再利用可能なミドルウェアを作成します。body をパースし、型付きデータを付加するか、詳細を含む 400 を返します。

import { z } from "zod"
import { Request, Response, NextFunction } from "express"

export function validateBody<T extends z.ZodTypeAny>(schema: T) {
  return (req: Request, res: Response, next: NextFunction) => {
    const r = schema.safeParse(req.body)
    if (!r.success) {
      return res.status(400).json({ error: "Invalid body", issues: r.error.format() })
    }
    req.body = r.data
    next()
  }
}

型変換と refine

z.coerce を使うと文字列の数値を受け入れ、z.enum を使うと既知の値に限定し、.refine を使うとフィールド間のルールを定義できます。

import { z } from "zod"

const signupSchema = z.object({
  email: z.string().email(),
  age: z.coerce.number().int().gte(13),
  role: z.enum(["user", "admin"]).default("user")
}).refine(v => v.role !== "admin" || v.age >= 18, { message: "admin must be adult" })

export type Signup = z.infer<typeof signupSchema>

// Coercion allows numbers in strings; refine adds cross-field rules

エラーに関するヒント

エラーに関するヒント:

  • 境界では必ず safeParse を使います。
  • 問題をクライアント向けに整形し、スタックトレースを漏らさないようにします。
  • throw された parse を捕捉する場合は、unknown を ZodError に絞り込みます。

zod の型推論チェック

確認問題:zod スキーマと TS の型をどのように同期させますか?

まとめ

まとめ:1つのスキーマを定義し、TS の型を推論し、safeParse で検証して、一貫した 400 エラーを返せるようミドルウェアに組み込みます。

よくある質問

「zodによるスキーマ検証とTSへの推論」レッスンは無料ですか?

はい。「zodによるスキーマ検証とTSへの推論」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、TypeScript Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 TypeScript Academyコースには全3レッスンが含まれています。

「zodによるスキーマ検証とTSへの推論」で何を学びますか?

zodでリクエストを検証し、スキーマからTypeScriptの型を推論し、安全なミドルウェアとエラー処理を追加します ブラウザで直接実行するハンズオンコードでTypeScript Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

TypeScript Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのTypeScript Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/3です。

「zodによるスキーマ検証とTSへの推論」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このTypeScript Academyレッスンでコードを書いて実行できますか?

はい。すべてのTypeScript Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Routerハンドラー、Request/Responseの型付け
  2. zodによるスキーマ検証とTSへの推論
  3. エラーミドルウェアとResult型
← TypeScript Academyに戻る