Yup对象数组条件校验:isReceivesSalary为true时如何要求至少一名board成员isReceivingSalary为true
Yup 条件校验实现方案
可以实现该需求,通过 Yup 提供的条件校验方法 when() 结合自定义测试方法 test() 即可完成规则配置,附带自定义错误提示的完整实现如下:
完整校验代码
import * as yup from 'yup'; const boardMembersValidation = yup.object().shape({ isReceivesSalary: yup.boolean().required('请配置是否发放薪资'), boardMembers: yup.array( yup.object().shape({ name: yup.string().required('请填写成员姓名'), country: yup.string().required('请填写成员所属国家'), additionalProperty: yup.object().shape({ isReceivingSalary: yup.boolean() }) }) ) // 条件校验:当顶层isReceivesSalary为true时触发数组校验 .when('isReceivesSalary', { is: true, then: schema => schema.test( 'hasAtLeastOneSalaryReceiver', // 自定义错误提示 '当开启薪资发放配置时,至少要有一名董事会成员设置为领取薪资', function (boardMembers) { // 校验逻辑:判断数组中是否存在至少一个符合要求的元素 return boardMembers.some(member => member.additionalProperty?.isReceivingSalary === true); } ) }) });
规则说明
- 基础字段校验保留了原配置,同时补充了必填项的自定义提示,可根据需求调整文案。
- 仅当顶层
isReceivesSalary值为true时,才会触发对boardMembers数组的额外校验,不满足触发条件时不会执行该校验逻辑。 - 自定义校验逻辑中使用可选链
?.兼容additionalProperty为空的边界情况,避免运行时报错。
校验调用示例
// 测试不符合规则的数据 const invalidData = { isReceivesSalary: true, boardMembers: [ { name: 'David', country: 'USA', additionalProperty: { isReceivingSalary: false } }, { name: 'Dave', country: 'France', additionalProperty: { isReceivingSalary: false } } ] }; // 校验触发错误提示 boardMembersValidation.validate(invalidData) .catch(err => console.log(err.message)); // 输出:当开启薪资发放配置时,至少要有一名董事会成员设置为领取薪资
内容的提问来源于stack exchange,提问作者Abhishek Shukla
相关产品推荐
相关产品推荐

