柯里化支持验证规则预置与执行解耦:第一层固化规则(如长度、正则),第二层接收数据返回校验结果;可组合链式校验器,并通过高阶函数 withValidation 实现验证与业务逻辑隔离。

函数柯里化本身不直接做参数验证,但它能天然支持“规则预置 + 执行解耦”的结构——把验证规则提前固化为部分参数,执行时只传业务数据,验证与逻辑自然分离。
用柯里化封装验证规则
把验证函数设计成柯里化形式:第一层接收校验规则(如最小长度、正则模式),返回一个可复用的校验器;第二层接收待验参数,返回布尔结果或错误信息。
- 例如:const hasMinLength = min => str => typeof str === 'string' && str.length >= min;
- const validateName = hasMinLength(2); —— 规则已固化,后续调用 validateName('A') 就自动走长度≥2检查
组合多个柯里化验证器
用函数组合(如 pipe 或手动嵌套)把多个单点验证器串成链式校验器,每个仍保持柯里化形态,便于复用和替换。
- const validateEmail = pipe(isString, matches(/^.+@.+\..+$/), hasMinLength(5));
- 规则组合后仍是柯里化函数:validateEmail('test@example.com') 返回 true,validateEmail('abc') 返回 false
柯里化 + 高阶函数实现执行隔离
写一个高阶函数 withValidation,它接收柯里化的验证器和业务函数,返回一个新函数:调用时先跑验证,通过才执行业务逻辑。
- const createUser = withValidation(validateEmail, (email) => { /* 创建用户 */ });
- 调用 createUser('invalid') 直接报错或跳过执行,createUser('ok@x.y') 才真正调用创建逻辑
- 验证规则(validateEmail)和业务动作(createUser)完全解耦,各自可独立测试、复用、替换
实际落地小技巧
避免过度抽象。柯里化验证器建议只固化「不可变规则」(如长度、格式、枚举值),动态依赖(如查数据库是否重复)放在执行阶段处理。
- ✅ 推荐:hasRole('admin')、inRange(1, 100)
- ❌ 慎用:isUsernameAvailable()(需异步)—— 改用 Promise + then 链或 async/await 在执行层处理

















