模块 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 次尝试后可用的解决方案