Pelajaran modul (3/4)
Tantangan: validator data
Memvalidasi data masukan adalah salah satu hal yang paling sering Anda lakukan: tanpa formulir, tanpa API yang bisa membabi buta mempercayai apa yang diterimanya. Mari kita buat validator kecil yang menggabungkan aturan yang dapat dikomposisi dan mengembalikan semua kesalahan yang ditemukan, bukan hanya kesalahan pertama.
Satu aturan = satu fungsi
Aturan mengambil objek dan mengembalikan null (semuanya baik) atau string dengan pesan kesalahan.
const nomeRichiesto = (utente) =>
utente.nome && utente.nome.length > 0 ? null : 'nome obbligatorio';
const etaMaggiore = (utente) => (utente.eta >= 18 ? null : 'devi essere maggiorenne');Menyusun banyak aturan
Validator menjalankan semua aturan dan mengumpulkan kesalahan:
function valida(utente, regole) {
const errori = [];
for (const regola of regole) {
const msg = regola(utente);
if (msg) errori.push(msg);
}
return errori;
}Gaya fungsional:
const valida = (obj, regole) => regole.map((r) => r(obj)).filter((m) => m !== null);Memutuskan apakah itu valid
const errori = valida(utente, [nomeRichiesto, etaMaggiore]);
const ok = errori.length === 0;Pola yang berguna: aturan pabrik
Bila Anda memiliki banyak bidang untuk divalidasi dengan logika yang sama, tulis pabrik:
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)];Setiap pabrik mengembalikan fungsi aturan yang telah dikonfigurasi sebelumnya. Ini persis seperti menggunakan parser generator atau validator seperti Zod, hanya dalam bentuk mini.
Cobalah
Tentukan `validasi(obj, aturan)`: terapkan setiap aturan (fungsi obj -> string|null) dan kembalikan array yang hanya berisi pesan bukan nol, dalam urutan yang sama dengan aturan.
Tunjukkan petunjuk
aturan.peta((r) => r(obj)).filter((m) => m !== null)
Solusi tersedia setelah 3 upaya
Tinjau latihan
Tentukan `wajib(bidang)` pabrik: ia mengembalikan aturan yang, jika diberi objek, mengembalikan null jika obj[bidang] tidak kosong (bukan nol, tidak terdefinisi, bukan string kosong), jika tidak, string '<field> obbligatorio'.
Tunjukkan petunjuk
Mengembalikan penutupan yang bertuliskan obj[field].
Solusi tersedia setelah 3 upaya