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) {
// ...
}