0Pricing
TypeScript Academy · レッスン

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 union

valibot の 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フィードバックを取得できます。ローカル設定は不要です。

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

  1. zod/valibotスキーマと推論
  2. 防御的パースとエラーエンベロープ
← TypeScript Academyに戻る