Introduction Ă  la librairie Zod

Zod est une librairie de schéma qui permet de valider des données en fonction de règles définies. Son concept central est de refléter les types TypeScript et de les appliquer aux données via des objets qui s’exécutent au runtime. En plus d’être un reflet du typage, Zod permet également de vérifier la conformité des données selon des règles spécifiques.

Mise en contexte

const userNameSchema = zod.string();

const userSchema = zod.object({
  name: userNameSchema,
  age: zod.number(),
});

Dans cet exmple, userNameSchema et userSchema son des schémas Zod, ils représentent des types. D’un point de vu runtime, ce sont des objets.

const userName = userNameSchema.parse("William"); // âś”
userNameSchema.parse(23); // âś–

const user = userSchema.parse({ name: "William", age: 23 }); // âś”
userSchema.parse({ toto: "tata" }); // âś–

Lors du parsing, Zod va cloner la valeur reçue en fonction du schéma. En cas d’echec il emmetera une erreur.

Schémas couramment utilisés

1. Types de base

Zod propose des schémas pour tous les types primitifs de JavaScript.

  • ChaĂ®ne de caractères (zod.string())

Le schéma de chaîne de caractères valide les valeurs de type string.

const nameSchema = zod.string();

nameSchema.parse("Alice"); // âś”
nameSchema.parse(123); // âś–
  • Nombre (z.number())

Utilisé pour valider des nombres, et peut être configuré pour vérifier les entiers, les bornes, etc.

const ageSchema = zod.number().min(18);

ageSchema.parse(25); // âś”
ageSchema.parse(16); // ✖ (doit être ≥ 18)
  • BoolĂ©en (zod.boolean())

Valide les valeurs booléennes (true ou false).

const isActiveSchema = zod.boolean();

isActiveSchema.parse(true); // âś”
isActiveSchema.parse("true"); // âś–
  • Null et Undefined (zod.null(), zod.undefined())

Pour valider les valeurs null ou undefined.

const nullSchema = zod.null();
const undefinedSchema = zod.undefined();

nullSchema.parse(null); // âś”
undefinedSchema.parse(undefined); // âś”
  • Literal (zod.literal())

Pour valider une valeur spécifique.

const statusSchema = zod.literal("active");

statusSchema.parse("active"); // âś”
statusSchema.parse("inactive"); // âś–

2. Schémas combinés

Zod permet de composer plusieurs schémas pour créer des validations complexes.

  • Objet (zod.object())

Les schémas d’objet permettent de définir la structure et les types attendus pour les propriétés.

const userSchema = zod.object({
  name: zod.string(),
  age: zod.number().min(18),
  email: zod.string().email(),
});

userSchema.parse({
  name: "Alice",
  age: 25,
  email: "[email protected]",
}); // âś”
  • Tableau (zod.array())

Valide les tableaux de valeurs d’un certain type.

const tagsSchema = zod.array(zod.string());  // OU zod.string().array()

tagsSchema.parse(["Zod", "Validation", "Types"]); // âś”
tagsSchema.parse(["Zod", 123]); // ✖ (éléments doivent être des chaînes)
  • EnumĂ©ration (zod.enum())

Pour restreindre une valeur à un ensemble spécifique de choix.

const roleSchema = zod.enum(["admin", "user", "guest"]);

roleSchema.parse("admin"); // âś”
roleSchema.parse("superuser"); // ✖ (non inclus dans l'énumération)
  • Union (zod.union())

Permet de valider une valeur contre plusieurs schémas possibles.

const responseSchema = zod.union([zod.string(), zod.number()]);

responseSchema.parse("OK"); // âś”
responseSchema.parse(200); // âś”
responseSchema.parse(true); // âś–

3. Schémas optionnels et par défaut

Zod permet de rendre des champs optionnels ou de définir des valeurs par défaut.

  • Optionnel (zod.optional())

Rendre une propriété facultative dans un schéma.

const optionalAgeSchema = zod.object({
  name: zod.string(),
  age: zod.optional(zod.number()), // zod.number().optional()
});

optionalAgeSchema.parse({ name: "Alice" }); // âś”
optionalAgeSchema.parse({ name: "Alice", age: 25 }); // âś”
  • Valeur par dĂ©faut (zod.default())

Permet de définir une valeur par défaut si une donnée est absente.

const defaultSchema = zod.object({
  name: zod.string(),
  age: zod.number().default(30),
});

defaultSchema.parse({ name: "Alice" }); // { name: "Alice", age: 30 }

4. Validation personnalisée

Zod vous permet de définir des validations personnalisées avec la méthode .refine().

const passwordSchema = zod.string().refine((pwd) => pwd.length >= 8, {
  message: "Le mot de passe doit contenir au moins 8 caractères.",
});

passwordSchema.parse("12345678"); // âś”
passwordSchema.parse("12345"); // âś–

On peut aussi customiser le message d’erreur directement dans la méthode de validation.

const userSchema = zod.object({
  name: zod.string({ message: "je veux ton nom !" }),
  age: zod.number({ message: "je veux ton âge !" }).min(18, "Tu es trop jeune").max(99, "tu es trop vieux"),
});

5. Transformer des données

Zod permet également de transformer des données lors de la validation avec .transform().

const stringToNumberSchema = zod.string().transform((val) => parseInt(val, 10));

stringToNumberSchema.parse("42"); // 42 (nombre)

On peut aussi éffectuer des transformations plus basique avec .coerce.typeAttendu() (date(), number(), etc).

const dateSchema = zod.coerce.date(); // equivalent Ă  new Date("2022-01-01")
const numberSchema = zod.coerce.number(); // equivalent Ă  parseInt("42", 10)

const date = dateSchema.parse("2022-01-01"); // (date)
const number = numberSchema.parse("42"); // (number)

Conclusion

Zod est une librairie de validation de données puissante et flexible qui s’intègre parfaitement avec TypeScript. Elle permet de définir des schémas complexes et de valider des données en fonction de ces schémas, offrant ainsi une solution robuste pour la gestion des entrées dans les applications TypeScript.

Retour au Référence