柯里化使表单验证规则更灵活、可复用、易组合:通过固化“验证函数+配置”生成只接收值的函数,支持组合、字段名绑定及声明式使用,并可扩展异步校验。

柯里化能让表单验证规则更灵活、可复用、易组合。核心思路是:把“验证函数 + 配置参数”提前固化,生成一个只接收待验证值的函数,后续直接传值调用即可。
用柯里化封装基础校验器
比如邮箱、手机号、最小长度等通用规则,可以写成接受配置再返回验证函数的形式:
const required = (msg = '必填项') => value => {
return value == null || value === '' ? msg : true;
};
const maxLength = (len, msg = `最多${len}个字符`) => value => {
return typeof value === 'string' && value.length > len ? msg : true;
};
const pattern = (reg, msg = '格式不正确') => value => {
return typeof value === 'string' && !reg.test(value) ? msg : true;
};
// 使用时生成具体规则
const emailRule = pattern(/^[^\s@]+@[^\s@]+\.[^\s@]+$/, '请输入有效邮箱');
const phoneRule = pattern(/^1[3-9]\d{9}$/, '请输入有效手机号');
组合多个规则,顺序执行并返回首个错误
柯里化后规则统一为 (value) => string | true 类型,方便用 reduce 组合:
const composeRules = (...rules) => value => {
for (const rule of rules) {
const result = rule(value);
if (result !== true) return result;
}
return true;
};
// 组合使用
const nameValidator = composeRules(
required('姓名不能为空'),
maxLength(10, '姓名不能超过10个字符')
);
const emailValidator = composeRules(
required('邮箱不能为空'),
pattern(/^[^\s@]+@[^\s@]+\.[^\s@]+$/, '邮箱格式错误')
);
动态绑定字段名,提升错误提示可读性
进一步柯里化,把字段名也提前传入,让错误消息自动带上下文:
const validateField = (fieldName) => (...rules) => value => {
const result = composeRules(...rules)(value);
if (result === true) return true;
return `${fieldName}:${result}`;
};
// 创建带字段名的验证器
const validateUsername = validateField('用户名')(
required(),
maxLength(20)
);
validateUsername(''); // → "用户名:必填项"
validateUsername('a'.repeat(25)); // → "用户名:最多20个字符"
与表单控件联动,实现声明式验证
在 React 或 Vue 等框架中,可将柯里化验证器直接作为 prop 传入组件,或配合 useForm 等逻辑复用:
// 假设一个通用 Input 组件
<input name="email" value="{email}" onchange="{setEmail}" rules="{[required('邮箱不能为空')," emailrule>
// 在组件内部统一执行
const validate = (rules, value) => {
for (const rule of rules) {
const res = rule(value);
if (res !== true) return res;
}
return true;
};
不复杂但容易忽略:柯里化本身不解决异步校验(如用户名是否已存在),但可以和 async/await 结合——只需让最内层函数返回 Promise,再配合 .then 或 await 处理即可。关键是保持签名一致、职责清晰。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











