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.
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 :
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 :
const valida = (obj, regole) => regole.map((r) => r(obj)).filter((m) => m !== null);Décider si l'objet est valide
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 :
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
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.
Afficher l'indice
rules.map((r) => r(obj)).filter((m) => m !== null)
Solution disponible après 3 tentatives
Exercice de révision
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'.
Afficher l'indice
Ritorna una closure che legge obj[field].
Solution disponible après 3 tentatives