Javascript Yup validate是字符串或字符串数组

Javascript Yup validate是字符串或字符串数组,javascript,formik,yup,Javascript,Formik,Yup,我想验证字段是字符串还是字符串数组 这里有一个例子,碰巧使用了formik,但实际上我正在使用yup进行服务器端验证 { email: yup .mixed() .oneOf([yup.array().of(yup.string()), yup.string()]) .nullable() } 其中一个仅适用于文字值。Lazy允许您动态提供模式,如下所示 { email: yup.lazy(val => (Array.isArra

我想验证字段是字符串还是字符串数组

这里有一个例子,碰巧使用了formik,但实际上我正在使用yup进行服务器端验证

  {
    email: yup
      .mixed()
      .oneOf([yup.array().of(yup.string()), yup.string()])
      .nullable()
  }

其中一个
仅适用于文字值。Lazy允许您动态提供模式,如下所示

{ 
  email: yup.lazy(val => (Array.isArray(val) ? yup.array().of(yup.string()) : yup.string()))
}
{
电邮:yup.mixed()
.当(‘isArray’){
is:Array.isArray,
然后:yup.array().of(yup.string()),
否则:yup.string(),
})
}

但是一组复选框可以生成一个数组,而文本输入则不能。您正在寻找一种解决方案来验证电子邮件是否被分隔符分隔?

David Adler的解决方案适合我

以下是一个基于TS的变体:

  from: Yup.lazy<string | string[]>(from => {
    return Array.isArray(from)
      ? Yup.array()
        .of(PathnameValidator.required())
        .required()
      : PathnameValidator.required();
  }),
from:Yup.lazy(from=>{
返回数组.isArray(从)
?是的,数组()
.of(PathnameValidator.required())
.required()
:PathnameValidator.required();
}),

当表单包含多个选择字段并将此字段保留为必填字段且至少需要选择一个选项时,此YUP简单验证适用于我的案例

 selectOptions: array()
         .min(1, "You can't leave this blank.")
         .required("You can't leave this blank.")
         .nullable()

我实际上是在对查询参数进行服务器端验证——我刚刚给出了一个formik示例,作为演示问题的一种方式抱歉,但这不起作用,因为它需要在您验证的对象上使用
isArray
布尔值,以便我们输入
然后
条件。使用
when(“email”,{})
也不起作用,因为它会产生某种无限循环。这是有效的解决方案