如何使用Yup验证UUID或指定字符串(如“System”)?
问题原因及解决方案
你的验证逻辑失败的核心原因是:Yup.mixed().oneOf()的参数是具体的有效值(如字符串、数字),而非Schema对象。你把string().min(36).max(36)这个Schema放进oneOf数组里,Yup会把它当作普通对象去匹配输入值,自然无法通过验证。
下面提供两种可行的解决方式:
方案一:自定义test验证函数
直接通过test方法编写逻辑,同时兼容"System"和长度36的字符串:
const validationSchema = Yup.mixed().test( 'system-or-uuid', '输入必须是"System"或长度为36的字符串', (value) => { // 先判断类型,再检查两种合法情况 if (typeof value !== 'string') return false; return value === 'System' || value.length === 36; } );
方案二:使用when分支验证
利用Yup的when方法,针对不同输入值应用不同验证规则:
const validationSchema = Yup.string().when('value', { // 当输入不是"System"时,验证长度为36 is: (val) => val !== 'System', then: Yup.string().min(36).max(36), // 否则验证输入必须是"System" otherwise: Yup.string().oneOf(['System']) });
如果需要更严谨的UUID格式验证(而非仅检查长度),可以把长度判断替换为UUID正则匹配,比如:
// 替换方案一中的判断条件 return value === 'System' || /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(value);
内容的提问来源于stack exchange,提问作者Ken Tsoi
相关产品推荐
相关产品推荐

