Zodスキーマに数値バリデーション制約を追加する

生成されたZodスキーマに.int()、.positive()、.min()、.max()、.finite()などの数値バリデーションメソッドを追加する方法を学びます。

Validation

詳細な説明

Zodの数値バリデーション

基本のz.number()バリデーターは任意の有限数値を受け入れます。Zodは特定のビジネスルールに合わせて数値を制約するメソッドを提供します。

一般的な数値バリデーター

import { z } from "zod";

const productSchema = z.object({
  // 整数のみ
  quantity: z.number().int("整数を入力してください"),

  // 正の数
  price: z.number().positive("価格は正の値である必要があります"),

  // 範囲
  rating: z.number().min(1, "最低評価は1です").max(5, "最高評価は5です"),

  // 非負
  stock: z.number().nonnegative("在庫は負にできません"),

  // 有限(Infinityなし)
  discount: z.number().finite().min(0).max(100),

  // 倍数
  pageSize: z.number().int().multipleOf(10),
});

組み込み数値バリデーター

メソッド バリデーション 有効な値の例
.int() 整数 142-7
.positive() > 0 10.5100
.nonnegative() >= 0 01100
.negative() < 0 -1-0.5
.nonpositive() <= 0 0-1
.min(n) >= n nに依存
.max(n) <= n nに依存
.finite() Infinityでない 任意の有限数
.multipleOf(n) nで割り切れる nの倍数
.safe() 安全な整数 Number.MAX_SAFE_INTEGER以内

バリデーターのチェーン

バリデーターは精密な制約のために自然にチェーンされます:

// パーセンテージ:0から100の整数
const percentSchema = z.number().int().min(0).max(100);

// 年齢:150未満の正の整数
const ageSchema = z.number().int().positive().max(150);

// 価格:小数点2桁の非負値
const priceSchema = z.number().nonnegative().multipleOf(0.01);

// ポート番号:有効な範囲の整数
const portSchema = z.number().int().min(1).max(65535);

文字列からの変換

フォームデータやクエリパラメータをパースする際、数値は文字列として到着します。z.coerce.number()を使用します:

const querySchema = z.object({
  page: z.coerce.number().int().positive().default(1),
  limit: z.coerce.number().int().min(1).max(100).default(20),
});

// { page: "3", limit: "50" }を{ page: 3, limit: 50 }にパース

これにより手動のparseInt()呼び出しが不要になり、1ステップでバリデーションできます。

ユースケース

Eコマース APIを構築し、商品価格が正の数、数量が非負の整数、割引率が0-100の範囲内であることを検証する必要がある場合に使用します。

試してみる — JSON to Zod Schema

フルツールを開く