Skip to Content

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"); // ❌ throws

Type 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>; // string

To 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); // ❌ throws

Zod 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); // ❌ throws

Enum 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

  1. Use as const when defining enum arrays in variables
  2. Prefer string literals over TypeScript enums
  3. Use discriminated unions when you need enums with associated data
  4. Extract/exclude to create subsets of existing enums