Lompati ke konten utama
Modul 8 · Pelajaran 3 dari 431/32 dalam kursus~15 min
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.

JS
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:

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

Gaya fungsional:

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

Memutuskan apakah itu valid

JS
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:

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)];

Setiap pabrik mengembalikan fungsi aturan yang telah dikonfigurasi sebelumnya. Ini persis seperti menggunakan parser generator atau validator seperti Zod, hanya dalam bentuk mini.

Cobalah

Latihan#js.m8.l3.e1
Upaya: 0Memuat…

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.

Memuat editor…
Tunjukkan petunjuk

aturan.peta((r) => r(obj)).filter((m) => m !== null)

Solusi tersedia setelah 3 upaya

Tinjau latihan

Latihan#js.m8.l3.e2
Upaya: 0Memuat…

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'.

Memuat editor…
Tunjukkan petunjuk

Mengembalikan penutupan yang bertuliskan obj[field].

Solusi tersedia setelah 3 upaya