Saltar al contenido principal
eLearner.app
Módulo 8 · Lección 3 de 431/32 en el curso~15 min
Lecciones del módulo (3/4)

Desafío: validador de datos

Validar datos de entrada es una de las tareas que harás más a menudo: ningún formulario ni ninguna API puede confiar ciegamente en lo que recibe. Construyamos un pequeño validador que combina reglas componibles y devuelve todos los errores encontrados, no solo el primero.

Una regla = una función

Una regla recibe el objeto y devuelve null (todo bien) o una cadena (string) con el mensaje de error.

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

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

Componer múltiples reglas

El validador ejecuta todas las reglas y recopila los errores:

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

En estilo funcional:

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

Decidir si es válido

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

Patrón útil: factory de reglas

Cuando tienes muchos campos que validar con la misma lógica, escribe una 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)];

Cada factory devuelve una función regla ya configurada. Es exactamente como usar un generador de parsers o un validador como Zod, pero en pequeño.

Pruébalo tú

Ejercicio#js.m8.l3.e1
Intentos: 0Cargando...

Define `validate(obj, rules)`: aplica cada regla (función obj -> stringa|null) y devuelve un array que contenga solo los mensajes no nulos, en el mismo orden que las reglas.

Cargando editor...
Mostrar pista

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

Solución disponible después de 3 intentos

Ejercicio de repaso

Ejercicio#js.m8.l3.e2
Intentos: 0Cargando...

Define la factory `required(field)`: devuelve una regla que, dado un objeto, devuelve null si obj[field] no está vacío (ni null, ni undefined, ni cadena vacía); en caso contrario, devuelve la cadena '<field> obbligatorio'.

Cargando editor...
Mostrar pista

Ritorna una closure che legge obj[field].

Solución disponible después de 3 intentos