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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- Routerハンドラー、Request/Responseの型付け
- zodによるスキーマ検証とTSへの推論
- エラーミドルウェアとResult型