Passer au contenu principal
eLearner.app
Module 8 · Leçon 3 sur 431/32 dans le cours~15 min
Leçons du module (3/4)

Défi : validateur de données

Valider les données d'entrée est l'une des tâches que vous ferez le plus souvent : aucun formulaire, aucune API ne peut faire aveuglément confiance à ce qu'elle reçoit. Construisons un petit validateur qui combine des règles composables et retourne toutes les erreurs trouvées, et pas seulement la première.

Une règle = une fonction

Une règle reçoit l'objet et retourne null (tout est ok) ou bien une chaîne de caractères contenant le message d'erreur.

JS
const nomeRichiesto = (utente) =>
  utente.nome && utente.nome.length > 0 ? null : 'nome obbligatorio';

const etaMaggiore = (utente) => (utente.eta >= 18 ? null : 'devi essere maggiorenne');

Composer plusieurs règles

Le validateur exécute toutes les règles et rassemble les erreurs :

JS
function valida(utente, regole) {
  const errori = [];
  for (const regola of regole) {
    const msg = regola(utente);
    if (msg) errori.push(msg);
  }
  return errori;
}

En style fonctionnel :

JS
const valida = (obj, regole) => regole.map((r) => r(obj)).filter((m) => m !== null);

Décider si l'objet est valide

JS
const errori = valida(utente, [nomeRichiesto, etaMaggiore]);
const ok = errori.length === 0;

Pattern utile : factory de règles

Lorsque vous avez de nombreux champs à valider avec la même logique, écrivez une factory :

JS
const richiesto = (campo) => (obj) =>
  obj[campo] != null && obj[campo] !== '' ? null : `${campo} obbligatorio`;

const minimo = (campo, n) => (obj) => (obj[campo] >= n ? null : `${campo} deve essere >= ${n}`);

const regole = [richiesto('nome'), richiesto('email'), minimo('eta', 18)];

Chaque factory retourne une fonction règle déjà configurée. C'est exactement comme utiliser un générateur de parser ou un validateur comme Zod, mais à petite échelle.

À vous de jouer

Exercice#js.m8.l3.e1
Tentatives : 0Chargement…

Définissez `validate(obj, rules)` : applique chaque règle (fonction obj -> stringa|null) et retourne un tableau contenant uniquement les messages non nuls, dans le même ordre que les règles.

Chargement de l'éditeur…
Afficher l'indice

rules.map((r) => r(obj)).filter((m) => m !== null)

Solution disponible après 3 tentatives

Exercice de révision

Exercice#js.m8.l3.e2
Tentatives : 0Chargement…

Définissez la factory `required(field)` : retourne une règle qui, à partir d'un objet, renvoie null si obj[field] n'est pas vide (ni null, ni undefined, ni chaîne vide), sinon la chaîne '<field> obbligatorio'.

Chargement de l'éditeur…
Afficher l'indice

Ritorna una closure che legge obj[field].

Solution disponible après 3 tentatives