Zod : valider une donnée entrante et en déduire son type

Zod décrit la forme attendue d'une donnée par un schéma, la vérifie à l'exécution et fournit le type TypeScript correspondant sans le réécrire.
3 min de lecture
Believemy logo

Un type TypeScript disparaît à la compilation. Le formulaire, la réponse d'API et le fichier de configuration, eux, arrivent à l'exécution, et rien ne garantit qu'ils ressemblent à ce qui était annoncé.

Zod comble ce trou : le même schéma vérifie la donnée pour de vrai et fournit son type.


Définition

Zod est une bibliothèque de validation par schéma. On décrit la forme attendue en assemblant des règles, puis on confronte une valeur inconnue à cette description. Ce qui passe est conforme, ce qui échoue est décrit ligne par ligne.

JAVASCRIPT
import { z } from "zod";

const Facture = z.object({
  id: z.number().int().positive(),
  email: z.email(),
  montant: z.number().min(0),
  statut: z.enum(["brouillon", "payee"]),
});

const resultat = Facture.safeParse(donneeRecue);
if (!resultat.success) {
  console.log(resultat.error.issues);
  // [{ path: ["id"], message: "Too small: expected number to be >0" }]
}

Chaque règle s'enchaîne à la précédente et restreint un peu plus l'ensemble accepté. La lecture se fait de gauche à droite : un nombre, entier, strictement positif.


Deux façons d'échouer

MéthodeCe qu'elle fait en cas d'échec
parseLève une erreur, à attraper avec un try
safeParseRend un objet dont la propriété success vaut false

La première convient là où l'échec est anormal, par exemple une variable d'environnement manquante au démarrage. La seconde convient partout où l'échec est attendu, typiquement un formulaire, puisqu'il faut afficher les messages plutôt qu'interrompre.


Le type vient du schéma

Écrire le schéma puis retaper le type à côté crée deux vérités qui divergeront. Zod déduit le second du premier, ce qui garantit qu'ils ne peuvent plus se contredire.

JAVASCRIPT
type Facture = z.infer<typeof Facture>;
// { id: number; email: string;
//   montant: number; statut: "brouillon" | "payee" }
Bon à savoir

Après un safeParse réussi, la propriété data porte déjà ce type. La vérification à l'exécution et la connaissance à la compilation viennent donc du même endroit, ce qui est exactement ce qui manquait à TypeScript seul.


Questions fréquentes

Question

Où placer la validation ?

À chaque frontière du programme : réponse d'API, corps de requête reçu, formulaire, variables d'environnement, contenu d'un fichier JSON. À l'intérieur, une fois la donnée validée, les types suffisent. Valider deux fois la même valeur au milieu de la chaîne ne fait que ralentir le programme.


Question

Zod remplace-t-il TypeScript ?

Non, les deux répondent à des questions différentes. TypeScript vérifie la cohérence du code écrit, avant l'exécution, sans coût une fois compilé. Zod vérifie une valeur réelle pendant l'exécution, avec un coût. Ils se complètent d'autant mieux que le second sait produire ce dont le premier a besoin.


Question

Que faire des messages d'erreur ?

Les messages par défaut sont écrits en anglais et pour un développeur : ils conviennent aux journaux, pas à un utilisateur. Chaque règle accepte un message personnalisé, ce qui permet de traduire et de reformuler au cas par cas. Le tableau issues porte le chemin de chaque champ fautif, de quoi placer le message sous le bon champ du formulaire.

Termes connexes

Découvrez notre glossaire JavaScript

Tous les mots de JavaScript expliqués simplement : mots-clés, objets natifs, méthodes, erreurs et concepts. Définitions claires et exemples qui tournent, pour apprendre et pour se dépanner.

Partager cet article

Tu veux nous aider ? Fais un lien vers cet article sur tes réseaux ou encore mieux : sur ton site, dans un article ou dans ta newsletter.