Модульні уроки (3/4)
Завдання: валідатор даних
Перевірка вхідних даних є однією з речей, які ви будете робити найчастіше: ні форма, ні API не можуть наосліп довіряти тому, що отримує. Давайте створимо невеликий валідатор, який поєднує компоновані правила та повертає усі знайдені помилки, а не лише першу.
Одне правило = одна функція
Правило приймає об’єкт і повертає null (усе добре) або рядок із повідомленням про помилку.
const nomeRichiesto = (utente) =>
utente.nome && utente.nome.length > 0 ? null : 'nome obbligatorio';
const etaMaggiore = (utente) => (utente.eta >= 18 ? null : 'devi essere maggiorenne');Складання кількох правил
Валідатор запускає всі правила та збирає помилки:
function valida(utente, regole) {
const errori = [];
for (const regola of regole) {
const msg = regola(utente);
if (msg) errori.push(msg);
}
return errori;
}Функціональний стиль:
const valida = (obj, regole) => regole.map((r) => r(obj)).filter((m) => m !== null);Вирішення, чи воно дійсне
const errori = valida(utente, [nomeRichiesto, etaMaggiore]);
const ok = errori.length === 0;Корисний шаблон: фабрика правил
Якщо у вас є багато полів для перевірки з однаковою логікою, напишіть 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)];Кожна фабрика повертає попередньо налаштовану функцію правила. Це точно так само, як використання аналізатора генератор або валідатор, такий як Zod, просто в мініатюрі.
Спробуйте
Визначте `validate(obj, rules)`: застосовуйте кожне правило (функція obj -> string|null) і повертайте масив, що містить лише ненульові повідомлення, у тому ж порядку, що й правила.
Показати підказку
rules.map((r) => r(obj)).filter((m) => m !== null)
Рішення доступне після 3 спроб
Повторна вправа
Визначте фабрику `required(field)`: вона повертає правило, яке, заданий об’єктом, повертає null, якщо obj[field] непорожній (не null, не undefined, не порожній рядок), інакше рядок '<field> obbligatorio'.
Показати підказку
Повертає закриття, яке читає obj[поле].
Рішення доступне після 3 спроб