Last Updated: 3/12/2026
Enums
Use z.enum to validate inputs against a fixed set of allowable string values.
Basic Enums
import * as z from "zod";
const FishEnum = z.enum(["Salmon", "Tuna", "Trout"]);
FishEnum.parse("Salmon"); // => "Salmon"
FishEnum.parse("Swordfish"); // ❌ throwsType Inference
Important: If you declare your string array as a variable, Zod won’t be able to properly infer the exact values of each element.
// ❌ Wrong - loses exact types
const fish = ["Salmon", "Tuna", "Trout"];
const FishEnum = z.enum(fish);
type FishEnum = z.infer<typeof FishEnum>; // stringTo fix this, always pass the array directly into the z.enum() function, or use as const.
// ✅ Correct - preserves exact types
const fish = ["Salmon", "Tuna", "Trout"] as const;
const FishEnum = z.enum(fish);
type FishEnum = z.infer<typeof FishEnum>; // "Salmon" | "Tuna" | "Trout"TypeScript Enums
You can also pass in an externally-declared TypeScript enum.
enum Fish {
Salmon = 0,
Tuna = 1
}
const FishEnum = z.enum(Fish);
FishEnum.parse(Fish.Salmon); // ✅
FishEnum.parse(0); // ✅
FishEnum.parse(2); // ❌ throwsZod 4 — This replaces the z.nativeEnum() API in Zod 3.
Note: Using TypeScript’s enum keyword is not recommended . Prefer string literal unions instead.
Enum-like Objects
Enum-like object literals ({ [key: string]: string | number }) are also supported.
const Fish = {
Salmon: 0,
Tuna: 1
} as const;
const FishEnum = z.enum(Fish);
FishEnum.parse(Fish.Salmon); // ✅
FishEnum.parse(0); // ✅
FishEnum.parse(2); // ❌ throwsEnum Utilities
Accessing Enum Values
To extract the schema’s values as an enum-like object:
const FishEnum = z.enum(["Salmon", "Tuna", "Trout"]);
FishEnum.enum;
// => { Salmon: "Salmon", Tuna: "Tuna", Trout: "Trout" }Excluding Values
To create a new enum schema, excluding certain values:
const FishEnum = z.enum(["Salmon", "Tuna", "Trout"]);
const TunaOnly = FishEnum.exclude(["Salmon", "Trout"]);
// => z.enum(["Tuna"])Extracting Values
To create a new enum schema, extracting certain values:
const FishEnum = z.enum(["Salmon", "Tuna", "Trout"]);
const SalmonAndTroutOnly = FishEnum.extract(["Salmon", "Trout"]);
// => z.enum(["Salmon", "Trout"])Common Use Cases
Status Codes
const StatusEnum = z.enum(["pending", "approved", "rejected"]);
type Status = z.infer<typeof StatusEnum>;Configuration Options
const LogLevel = z.enum(["debug", "info", "warn", "error"]);API Endpoints
const HttpMethod = z.enum(["GET", "POST", "PUT", "DELETE", "PATCH"]);Best Practices
- Use
as constwhen defining enum arrays in variables - Prefer string literals over TypeScript enums
- Use discriminated unions when you need enums with associated data
- Extract/exclude to create subsets of existing enums