Formulaires sûrs du point de vue des types et contrats de réponses d’API
Utilisez Zod pour déduire les types TypeScript des schémas et valider les données de formulaire comme les réponses d’API.
Formulaires sûrs du point de vue des types et contrats de réponses d’API est une leçon React Academy gratuite sur CoddyKit. Ceci est la leçon 4 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage React Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours React Academy comprend 4 leçons au total.
Pourquoi les structures de données typées sont importantes
Les formulaires et les réponses d'API sont des frontières où des données provenant de sources non fiables entrent dans votre application. Zod vous permet de définir des schémas qui valident les données à l'exécution et infèrent également les types TypeScript.
Bases des schémas Zod
Définissez des schémas avec l'API fluide de Zod. Utilisez z.infer<typeof schema> pour extraire le type TypeScript.
import { z } from 'zod';
const UserSchema = z.object({
id: z.string().uuid(),
name: z.string().min(1).max(100),
email: z.string().email(),
age: z.number().int().min(0).max(150).optional(),
role: z.enum(['admin', 'user', 'guest']),
});
type User = z.infer<typeof UserSchema>;
// { id: string; name: string; email: string; age?: number; role: 'admin'|'user'|'guest' }React Hook Form avec le résolveur Zod
Intégrez les schémas Zod à React Hook Form pour une validation de formulaires sûre du point de vue du typage — TypeScript connaît la structure des données et des erreurs du formulaire.
import { useForm } from 'react-hook-form';
import { zodResolver } from '@hookform/resolvers/zod';
const LoginSchema = z.object({
email: z.string().email('Invalid email'),
password: z.string().min(8, 'At least 8 characters'),
});
type LoginData = z.infer<typeof LoginSchema>;
function LoginForm() {
const { register, handleSubmit, formState: { errors } } = useForm<LoginData>({
resolver: zodResolver(LoginSchema),
});
const onSubmit = (data: LoginData) => {
// data is LoginData — fully typed, already validated
};
}Valider les réponses d'API
Analysez les réponses d'API avec Zod pour détecter les incompatibilités de structure à la frontière — si l'API renvoie des données inattendues, vous obtenez une erreur détaillée au lieu d'un plantage à l'exécution au cœur de votre composant.
async function fetchUser(id: string): Promise<User> {
const res = await fetch(`/api/users/${id}`);
const json = await res.json();
return UserSchema.parse(json); // throws ZodError if shape is wrong
}Analyse sûre pour des erreurs gérées
Utilisez schema.safeParse() pour obtenir un objet de résultat plutôt que de lever une exception — c'est idéal pour la validation de formulaires lorsque vous souhaitez afficher les erreurs à l'utilisateur.
const result = UserSchema.safeParse(formData);
if (!result.success) {
const errors = result.error.flatten().fieldErrors;
// { name: ['Must be at least 1 character'], email: ['Invalid email'] }
return errors;
}
const user = result.data; // User — fully typedUnions discriminées avec Zod
Utilisez z.discriminatedUnion pour modéliser des réponses d’API dont la structure diffère selon un indicateur de réussite ou d’erreur.
const ApiResponse = z.discriminatedUnion('ok', [
z.object({ ok: z.literal(true), data: UserSchema }),
z.object({ ok: z.literal(false), error: z.string(), code: z.number() }),
]);
type ApiResult = z.infer<typeof ApiResponse>;
// { ok: true; data: User } | { ok: false; error: string; code: number }Transformations avec Zod
Utilisez .transform() pour convertir ou remanier les données pendant l’analyse — par exemple, convertir une chaîne représentant une date en objet Date.
const DateSchema = z.string().transform(s => new Date(s));
// Input: '2024-01-15' → Output: Date object
const EventSchema = z.object({
title: z.string(),
date: z.string().pipe(z.coerce.date()),
});
type Event = z.infer<typeof EventSchema>;
// { title: string; date: Date }Réutiliser les schémas
Dérivez les schémas de création et de mise à jour à partir du schéma de base pour éviter les duplications.
const UserSchema = z.object({ name: z.string(), email: z.string().email() });
// For creation: add password
const CreateUserSchema = UserSchema.extend({ password: z.string().min(8) });
// For update: all fields optional
const UpdateUserSchema = UserSchema.partial();
type CreateUser = z.infer<typeof CreateUserSchema>;
type UpdateUser = z.infer<typeof UpdateUserSchema>;Action serveur avec Zod
Validez les données du formulaire dans une action serveur Next.js avec Zod avant d’accéder à la base de données.
async function createPost(formData: FormData) {
'use server';
const schema = z.object({ title: z.string().min(3), body: z.string().min(10) });
const result = schema.safeParse(Object.fromEntries(formData));
if (!result.success) return { errors: result.error.flatten().fieldErrors };
await db.post.create({ data: result.data });
revalidatePath('/blog');
redirect('/blog');
}Schémas partagés entre le client et le serveur
Exportez les schémas Zod depuis un module partagé afin que le client et le serveur utilisent la même logique de validation — un seul schéma comme source de vérité.
// packages/schemas/src/user.ts
export const CreateUserSchema = z.object({ ... });
export type CreateUser = z.infer<typeof CreateUserSchema>;
// Frontend imports:
import { CreateUserSchema, CreateUser } from '@company/schemas';
// Backend imports:
import { CreateUserSchema } from '@company/schemas';Messages d’erreur de Zod
Personnalisez les messages d’erreur pour chaque champ afin d’améliorer l’expérience utilisateur — Zod les transmet automatiquement à l’affichage des erreurs du formulaire via le résolveur.
const RegistrationSchema = z.object({
username: z.string()
.min(3, 'Username must be at least 3 characters')
.max(20, 'Username cannot exceed 20 characters')
.regex(/^[a-z0-9_]+$/, 'Only lowercase letters, numbers, and underscores'),
});Vérification rapide
Que fournit z.infer<typeof MySchema> en TypeScript ?
Récapitulatif
Définissez les schémas Zod une seule fois et utilisez z.infer pour en déduire les types TypeScript. Utilisez zodResolver dans React Hook Form pour une validation sûre du point de vue des types. Analysez les réponses d’API avec Zod à la frontière de l’application, utilisez safeParse pour obtenir des erreurs destinées à l’utilisateur et partagez les schémas entre le client et le serveur via un module partagé.
Questions Fréquemment Posées
La leçon « Formulaires sûrs du point de vue des types et contrats de réponses d’API » est-elle gratuite ?
Oui — le texte complet de « Formulaires sûrs du point de vue des types et contrats de réponses d’API » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours React Academy, passe à CoddyKit PRO. Le cours React Academy comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Formulaires sûrs du point de vue des types et contrats de réponses d’API » ?
Utilisez Zod pour déduire les types TypeScript des schémas et valider les données de formulaire comme les réponses d’API. Tu pratiques React Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer React Academy ?
Aucune expérience préalable n'est requise. React Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 4 sur 4.
Combien de temps prend la leçon « Formulaires sûrs du point de vue des types et contrats de réponses d’API » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon React Academy ?
Oui. Chaque leçon React Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- Unions discriminées pour les variantes de composants
- Types conditionnels et mappés dans React
- Composants polymorphes avec la propriété « as »
- Formulaires sûrs du point de vue des types et contrats de réponses d’API