Lab 11: Zod Runtime Validation

Time: 30 minutes | Level: Practitioner | Docker: docker run -it --rm node:20-alpine sh

Zod schemas: string/number/object/array/enum/union/discriminatedUnion/lazy/transform/refine, z.infer<>, parse vs safeParse, ZodError formatting.


Step 1: Setup

docker run -it --rm node:20-alpine sh
npm install -g typescript ts-node
mkdir /lab11 && cd /lab11
npm init -y
npm install zod
cat > tsconfig.json << 'EOF'
{
  "compilerOptions": {
    "target": "ES2020",
    "module": "commonjs",
    "moduleResolution": "node",
    "strict": true,
    "esModuleInterop": true
  }
}
EOF

Step 2: Basic Primitives


Step 3: Object Schemas


Step 4: SafeParse & Error Formatting


Step 5: Union & Discriminated Union


Step 6: Transform & Refine


Step 7: Lazy (Recursive Schemas)


Step 8: Capstone — Full Validation

Run:

📸 Verified Output:


Summary

Zod API
Description

z.string().email()

Email validation

z.number().int().min(0)

Integer with minimum

z.object({...})

Object schema

z.array(schema)

Array of schema

z.enum([...])

Enum values

z.union([...])

Multiple valid types

z.discriminatedUnion(key, [...])

Tagged union

z.lazy(() => schema)

Recursive schema

.transform(fn)

Parse + transform

.refine(fn, msg)

Custom validation

.parse(data)

Throws on failure

.safeParse(data)

Returns { success, data/error }

z.infer<typeof Schema>

Derive TypeScript type

Last updated