JSON文字列値からZod Enumを生成する
固定の文字列値セットを含むJSONフィールドからZod enumスキーマ(z.enum())を作成する方法を学びます。z.enum()とz.union()のリテラルを比較。
Arrays
詳細な説明
JSONデータからのZod Enum
JSONフィールドが少数のカテゴリ文字列値を含む場合、バリデーションとオートコンプリートの両方のためにZod enumとして表現できます。
JSON例
[
{ "id": 1, "status": "active" },
{ "id": 2, "status": "inactive" },
{ "id": 3, "status": "pending" }
]
Zod Enumスキーマ
import { z } from "zod";
const statusEnum = z.enum(["active", "inactive", "pending"]);
const accountSchema = z.object({
id: z.number().int(),
status: statusEnum,
});
type Status = z.infer<typeof statusEnum>;
// "active" | "inactive" | "pending"
z.enum() vs z.union()のリテラル
両方のアプローチが機能しますが、z.enum()は追加機能を提供します:
// z.enumアプローチ
const status = z.enum(["active", "inactive", "pending"]);
status.enum.active; // "active" — 値へのランタイムアクセス
status.options; // ["active", "inactive", "pending"]
// z.unionアプローチ
const status2 = z.union([
z.literal("active"),
z.literal("inactive"),
z.literal("pending"),
]);
// .enumや.optionsアクセスなし
ネイティブEnum
既存のTypeScript enumがある場合はz.nativeEnum()を使用します:
enum Priority {
High = "high",
Medium = "medium",
Low = "low",
}
const prioritySchema = z.nativeEnum(Priority);
値の抽出と除外
const allStatus = z.enum(["active", "inactive", "pending", "banned"]);
// サブセット
const activeStatus = allStatus.extract(["active", "pending"]);
// 除外
const inactiveStatus = allStatus.exclude(["active"]);
z.enum()を使うべき場合
- フィールドが固定された既知の文字列値セットを受け入れる。
- enum値へのランタイムアクセスが必要(例:ドロップダウン用)。
- 異なるコンテキスト用に値を抽出または除外する必要がある。
- エラーメッセージが有効なオプションを自動的にリストすべき場合。
ユースケース
注文管理ダッシュボードのフィルタドロップダウンを構築し、すべての可能なステータス値へのランタイムアクセスと選択された値のコンパイル時型安全性の両方が必要な場合に使用します。