教程 zod tutorial

Enums

Zod 提供了两种方式来处理枚举:原生 TypeScript 枚举和 Zod 枚举。

Zod 枚举

使用 z.enum() 创建枚举验证器:

ts
import { z } from "zod";

const FishEnum = z.enum(["Salmon", "Tuna", "Trout"]);
type FishEnum = z.infer<typeof FishEnum>; // "Salmon" | "Tuna" | "Trout"

// 验证
FishEnum.parse("Salmon"); // 通过
FishEnum.parse("Shark");  // 失败

枚举值

你可以使用 .enum 对象访问所有有效的枚举值:

ts
const FishEnum = z.enum(["Salmon", "Tuna", "Trout"]);

// 枚举值
console.log(FishEnum.enum.Salmon); // "Salmon"
console.log(FishEnum.enum.Tuna);   // "Tuna"

// 所有选项
console.log(FishEnum.options); // ["Salmon", "Tuna", "Trout"]

原生 TypeScript 枚举

使用 z.nativeEnum() 来验证原生 TypeScript 枚举:

ts
enum NativeFish {
  Salmon = "SALMON",
  Tuna = "TUNA",
  Trout = "TROUT",
}

const NativeFishEnum = z.nativeEnum(NativeFish);
type NativeFishEnum = z.infer<typeof NativeFishEnum>; // NativeFish

// 验证
NativeFishEnum.parse(NativeFish.Salmon); // 通过
NativeFishEnum.parse("SALMON");          // 通过
NativeFishEnum.parse("Salmon");          // 失败

数字枚举

Zod 也支持数字枚举:

ts
enum NumericFish {
  Salmon,  // 0
  Tuna,    // 1
  Trout,   // 2
}

const NumericFishEnum = z.nativeEnum(NumericFish);

// 验证
NumericFishEnum.parse(0);        // 通过
NumericFishEnum.parse(1);        // 通过
NumericFishEnum.parse("Salmon"); // 失败

常量枚举

Zod 支持 TypeScript 的 const enum 特性:

ts
const enum ConstFish {
  Salmon = "SALMON",
  Tuna = "TUNA",
  Trout = "TROUT",
}

const ConstFishEnum = z.nativeEnum(ConstFish);

// 验证
ConstFishEnum.parse("SALMON"); // 通过
ConstFishEnum.parse("SHARK");  // 失败

自动补全

Zod 枚举提供了完整的类型推断和自动补全支持:

ts
const FishEnum = z.enum(["Salmon", "Tuna", "Trout"]);

// 在编辑器中输入 FishEnum.enum. 会显示所有选项
const fish = FishEnum.enum.Salmon;

// 在编辑器中输入 fish === FishEnum.enum. 会显示所有选项
if (fish === FishEnum.enum.Tuna) {
  // ...
}