Zod (CZ článek)

Back to blog

Validace dat v TypeScriptu jednoduše a bezpečně

3 min read
Table of Contents

Zod je typově bezpečná validační knihovna pro JS / TS ekosystém. Je navržena tak, aby dokonale zapadala do TypeScriptu — bez duplikace typů, bez boilerplate a s intuitivním API.

Na rozdíl od starších validátorů jako Joi nebo Yup, Zod vyniká přímým spojením validace s typováním. Když definuješ schéma, automaticky z něj získáš i TypeScript typ. Žádné as, žádné manuální definice.

Základní použití

import { z } from 'zod';

const User = z.object({
  name: z.string(),
  age: z.number().int().positive(),
});

const objectToTest = { name: 'Anna', age: 30 };

const result = User.safeParse(objectToTest);

if (!result.success) {
  console.error(result.error.format());
} else {
  // data je automaticky typované
  const data = result.data;
  console.log(data.name.toUpperCase());
}
  • z.object(...) definuje tvar objektu
  • safeParse() vrací výsledek s rozlišením na success a error
  • uvnitř result.data už máš typovaná data

Proč Zod?

  • zajišťuje validaci runtime dat
  • žádné závislosti
  • z validace automaticky získáš TypeScript typ
  • zamezuje duplikaci: píšeš schéma jen jednou
  • hodí se pro API, formuláře, externí data nebo konfigurace
  • immutable API: metody vrací novou instanci objektu
  • široký ekosystém nástrojů a odvozených knihoven
  • funguje v Node.js i v moderních prohlížečích (= frontend i backend)
  • malá velikost (2kb core bundle ve verzi v4)

Pokročilé možnosti

Extrakce TS type ze schémata

const Player = z.object({ 
  username: z.string(),
  xp: z.number()
});
 
// extract the inferred type
type Player = z.infer<typeof Player>;
 
// use it in your code
const player: Player = { username: "billie", xp: 100 };

Volitelné a defaultní hodnoty

const Schema = z.object({
  isActive: z.boolean().optional().default(true),
});

Enumy

const Role = z.enum(['admin', 'user', 'guest']);

Validace polí

const Tags = z.array(z.string().min(2));

Union typy

const Payload = z.union([
  z.object({ type: z.literal('text'), value: z.string() }),
  z.object({ type: z.literal('image'), url: z.string().url() }),
]);

Transformace

const Email = z.string().email().transform(str => str.toLowerCase());

const result = Email.parse('USER@EMAIL.COM'); // 'user@email.com'

Integrace s frontendem

Zod se výborně doplňuje s:

  • React Hook Form (resolver)
  • TanStack Form / TanStack Query (validace API odpovědí)
  • Next.js (validace route params a server-side props)
  • TRPC (schéma jako typ i validátor)
  • tools pro všechny AI modely

Příklad: validace vstupu z formuláře

const ContactFormSchema = z.object({
  email: z.string().email(),
  message: z.string().min(10),
});

// Na serveru:
export function handleForm(data: unknown) {
  const parsed = ContactFormSchema.safeParse(data);
  if (!parsed.success) return { error: parsed.error.flatten() };

  // parsed.data je správné a typované
  sendEmail(parsed.data);
}

// Na frontendu můžeš udělat to samé nebo použít něco jako React Hook Form (integrace se Zod)

Shrnutí

Zod je moderní, výkonná a minimalistická validační knihovna navržená s důrazem na typovou bezpečnost. Eliminuje duplikaci typů, snadno se integruje do různých prostředí a zjednodušuje validaci runtime dat v TypeScriptu.