You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 15:39:03