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値へのランタイムアクセスが必要(例:ドロップダウン用)。
  • 異なるコンテキスト用に値を抽出または除外する必要がある。
  • エラーメッセージが有効なオプションを自動的にリストすべき場合。

ユースケース

注文管理ダッシュボードのフィルタドロップダウンを構築し、すべての可能なステータス値へのランタイムアクセスと選択された値のコンパイル時型安全性の両方が必要な場合に使用します。

試してみる — JSON to Zod Schema

フルツールを開く