TypeScript types vanish at runtime, so they can't protect you from bad API responses or user input. Zod validates at runtime AND infers your static types from the same schema — one source of truth.
Define Once, Infer the Type
import { z } from "zod";
const User = z.object({
name: z.string().min(2),
email: z.string().email(),
age: z.number().int().positive().optional(),
});
type User = z.infer<typeof User>; // no duplicate interface neededValidate Safely
const result = User.safeParse(input);
if (!result.success) {
return { errors: result.error.flatten().fieldErrors };
}
const user = result.data; // fully typed & validatedValidate Environment Variables at Boot
A favorite production trick: parse process.env through a Zod schema at startup, so a missing variable fails loudly on deploy instead of silently at 3am.
Use It Everywhere
Forms (with React Hook Form), Server Actions, API route bodies, and webhooks — anywhere untrusted data enters your app, parse it with Zod first.
