zod/valibotスキーマと推論
スキーマで信頼できないデータを検証し、バリデーターから直接TS型を推論します。zodとvalibotを比較し、ハンドラーに組み込みます。
「zod/valibotスキーマと推論」はCoddyKit上の無料TypeScript Academyレッスンです。 これはレッスン1/2です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはTypeScript Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 TypeScript Academyコースには全2レッスンが含まれています。
導入
目標:外部入力をunknownとして扱い、スキーマで検証し、そのスキーマからTSの型を推論します。zodを使用し、valibotの構文を確認して、ハンドラー用の小さなヘルパーを作成します。
- 信頼できる唯一の情報源
- safeParseとparseの違い
- 推論した型の再利用
zod の infer
スキーマは一度だけ定義します。type User = z.infer<typeof userSchema>によって、検証ルールが正確に反映されます。
import { z } from "zod"
export const userSchema = z.object({
id: z.string().uuid(),
name: z.string().min(1),
age: z.number().int().min(0).optional()
})
export type User = z.infer<typeof userSchema>
// User is kept in sync with runtime rules.safeParse と parse
safeParseは例外をスローせずに成功または失敗の結果を返すため、HTTPハンドラーに適しています。一方、parseは入力が無効な場合に例外をスローします。
import type { Request, Response } from "express"
import { userSchema, type User } from "./schema"
export function createUser(req: Request, res: Response<User | { error: string; issues?: unknown }>) {
const r = userSchema.safeParse(req.body)
if (!r.success) {
return res.status(400).json({ error: "Invalid body", issues: r.error.format() })
}
const user = r.data
return res.status(201).json(user)
}
// parse() throws; safeParse() returns a discriminated unionvalibot の infer
valibotは、Infer<typeof schema>を備えた簡潔なバリデーターを提供します。ライブラリを1つ選び、チーム全体で統一します。
import { object, string, number, optional, minLength, uuid, minValue } from "valibot"
import type { Infer } from "valibot"
export const VUser = object({
id: string([uuid()]),
name: string([minLength(1)]),
age: optional(number([minValue(0)]))
})
export type VUserT = Infer<typeof VUser>
// Similar idea: one schema, inferred type.検証ヘルパー
パース処理を小さなヘルパーでラップし、ハンドラーがシンプルな{ ok,data }と{ ok:false,issues }の構造を受け取れるようにします。
import { ZodTypeAny } from "zod"
export function validate<T extends ZodTypeAny, Out = unknown>(schema: T, value: unknown, onError?: (issues: unknown) => never | void): { ok: true; data: Out } | { ok: false; issues: unknown } {
const r = schema.safeParse(value)
if (!r.success) {
const issues = r.error.format()
if (onError) onError(issues as unknown as never)
return { ok: false, issues }
}
return { ok: true, data: r.data as unknown as Out }
}ヒント
ヒント:
- スキーマは境界(HTTP、CLI、DB IO)の近くに配置します。
- 型を推論してエクスポートし、手書きの重複定義は避けます。
- 問題の詳細を含む400を返し、クライアントからの入力を決して信頼しません。
推論の利点チェック
クイックチェック:なぜスキーマから型を推論するのですか?
まとめ
まとめ:zod/valibotでunknownの入力を検証し、safeParseを使用して、型を推論することでコンパイル時と実行時の整合性を保ちます。
よくある質問
「zod/valibotスキーマと推論」レッスンは無料ですか?
はい。「zod/valibotスキーマと推論」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、TypeScript Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 TypeScript Academyコースには全2レッスンが含まれています。
「zod/valibotスキーマと推論」で何を学びますか?
スキーマで信頼できないデータを検証し、バリデーターから直接TS型を推論します。zodとvalibotを比較し、ハンドラーに組み込みます。 ブラウザで直接実行するハンズオンコードでTypeScript Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
TypeScript Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのTypeScript Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/2です。
「zod/valibotスキーマと推論」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このTypeScript Academyレッスンでコードを書いて実行できますか?
はい。すべてのTypeScript Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- zod/valibotスキーマと推論
- 防御的パースとエラーエンベロープ