Enums
Zod provides two ways to handle enums: native TypeScript enums and Zod enums.
Zod Enums
Use z.enum()
to create an enum validator:
ts
import { z } from "zod";
const FishEnum = z.enum(["Salmon", "Tuna", "Trout"]);
type FishEnum = z.infer<typeof FishEnum>; // "Salmon" | "Tuna" | "Trout"
// Validation
FishEnum.parse("Salmon"); // passes
FishEnum.parse("Shark"); // fails
Enum Values
You can access all valid enum values using the .enum
object:
ts
const FishEnum = z.enum(["Salmon", "Tuna", "Trout"]);
// Enum values
console.log(FishEnum.enum.Salmon); // "Salmon"
console.log(FishEnum.enum.Tuna); // "Tuna"
// All options
console.log(FishEnum.options); // ["Salmon", "Tuna", "Trout"]
Native TypeScript Enums
Use z.nativeEnum()
to validate native TypeScript enums:
ts
enum NativeFish {
Salmon = "SALMON",
Tuna = "TUNA",
Trout = "TROUT",
}
const NativeFishEnum = z.nativeEnum(NativeFish);
type NativeFishEnum = z.infer<typeof NativeFishEnum>; // NativeFish
// Validation
NativeFishEnum.parse(NativeFish.Salmon); // passes
NativeFishEnum.parse("SALMON"); // passes
NativeFishEnum.parse("Salmon"); // fails
Numeric Enums
Zod also supports numeric enums:
ts
enum NumericFish {
Salmon, // 0
Tuna, // 1
Trout, // 2
}
const NumericFishEnum = z.nativeEnum(NumericFish);
// Validation
NumericFishEnum.parse(0); // passes
NumericFishEnum.parse(1); // passes
NumericFishEnum.parse("Salmon"); // fails
Const Enums
Zod supports TypeScript's const enum
feature:
ts
const enum ConstFish {
Salmon = "SALMON",
Tuna = "TUNA",
Trout = "TROUT",
}
const ConstFishEnum = z.nativeEnum(ConstFish);
// Validation
ConstFishEnum.parse("SALMON"); // passes
ConstFishEnum.parse("SHARK"); // fails
Autocomplete
Zod enums provide full type inference and autocomplete support:
ts
const FishEnum = z.enum(["Salmon", "Tuna", "Trout"]);
// Type FishEnum.enum. in your editor to see all options
const fish = FishEnum.enum.Salmon;
// Type fish === FishEnum.enum. in your editor to see all options
if (fish === FishEnum.enum.Tuna) {
// ...
}