almessadi.
Retour à l'index

TypeScript a encore besoin de validation à l'exécution à la frontière_

TypeScript est excellent pour la correction interne, mais une fois que les données franchissent une frontière de confiance, vous avez besoin d'une validation exécutable. C'est pourquoi Zod s'intègre si bien dans les applications TypeScript full-stack.

Publié4 août 2024
Temps de lecture9 min read

TypeScript rend le code d'application plus sûr. Il ne valide pas les entrées non fiables à l'exécution.

Cela peut sembler évident, mais les équipes mélangent encore ces deux idées. Elles modélisent une charge utile de requête comme une interface, castent les données entrantes et sont surprises lorsque le système accepte néanmoins des entrées malformées.

La raison est simple : les interfaces disparaissent à l'exécution.

Où le problème commence vraiment

Voici les frontières de confiance :

  • corps de requête
  • paramètres de requête
  • variables d'environnement
  • charges utiles de webhook
  • stockage local et données de formulaire
  • réponses d'API tierces

De l'autre côté de ces frontières, les données sont simplement unknown. Si vous omettez la validation là, TypeScript ne protège plus rien de significatif.

Pourquoi Zod fonctionne bien

Zod est utile parce que le schéma existe sous forme de code exécutable :

import { z } from "zod";

export const CreateUserSchema = z.object({
  email: z.string().email(),
  age: z.number().int().positive(),
  name: z.string().min(1),
});

Vous pouvez valider les données entrantes directement :

const result = CreateUserSchema.safeParse(req.body);

if (!result.success) {
  return res.status(400).json({
    error: "Charge utile invalide",
    details: result.error.flatten(),
  });
}

await db.user.create({ data: result.data });

Maintenant, la logique de validation est réelle, et non implicite.

Le meilleur aspect dans les projets TypeScript

Vous bénéficiez toujours de types forts à partir du même schéma :

type CreateUserInput = z.infer<typeof CreateUserSchema>;

C'est pourquoi Zod semble si naturel dans les applications TypeScript full-stack. Vous n'avez pas à choisir entre la validation à l'exécution et l'ergonomie à la compilation.

Le compromis

Le compromis est l'explicité. Vous écrivez des schémas de manière intentionnelle, les maintenez et décidez où la validation doit se situer. C'est un travail. C'est juste un travail beaucoup mieux que de déboguer des charges utiles malformées une fois qu'elles sont profondément intégrées dans le système.

Impact SEO et produit

La validation n'est pas un problème purement backend. Une validation plus propre mène à une meilleure gestion des erreurs, des formulaires plus stables, moins de flux utilisateurs brisés, et un comportement applicatif plus crawlable lorsque les réponses des serveurs restent prévisibles. Cela aide à la fois la fiabilité et la confiance des utilisateurs.

Lecture complémentaire