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() |
整数 | 1、42、-7 |
.positive() |
> 0 | 1、0.5、100 |
.nonnegative() |
>= 0 | 0、1、100 |
.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の範囲内であることを検証する必要がある場合に使用します。