0Pricing
React Academy · Leçon

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 typed

Unions 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

  1. Unions discriminées pour les variantes de composants
  2. Types conditionnels et mappés dans React
  3. Composants polymorphes avec la propriété « as »
  4. Formulaires sûrs du point de vue des types et contrats de réponses d’API
← Retour à React Academy