跳转到主要内容
模块 8 · 第 3 课(共 4)课程中的31/32~15 min
模块课程(3/4)

挑战:数据验证器

验证输入数据是你最常做的事情之一:没有表单,没有API可以盲目 相信它收到的东西。让我们构建一个小型验证器,它结合了可组合规则和 返回发现的所有错误,而不仅仅是第一个错误。

一条规则=一种功能

规则接受对象并返回 null (一切正常)或带有错误消息的 字符串。

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

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

编写多个规则

验证器运行所有规则并收集错误:

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

功能风格:

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

判断是否有效

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

有用的模式:规则工厂

当您有许多字段需要使用相同的逻辑进行验证时,请编写一个工厂:

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

每个工厂都会返回一个预先配置的规则函数。这就像使用解析器一样 生成器或验证器(例如 Zod),只是微型版本。

尝试一下

锻炼#js.m8.l3.e1
尝试:0加载中...

定义“validate(obj, Rules)”:应用每个规则(函数 obj -> string|null)并返回一个仅包含非空消息的数组,其顺序与规则相同。

正在加载编辑器...
显示提示

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

3 次尝试后可用的解决方案

复习练习

锻炼#js.m8.l3.e2
尝试:0加载中...

定义工厂“required(field)”:它返回一个规则,给定一个对象,如果 obj[field] 非空(非空、非未定义、非空字符串),则返回 null,否则返回字符串“<field> obbligatorio”。

正在加载编辑器...
显示提示

返回一个读取 obj[field] 的闭包。

3 次尝试后可用的解决方案