Reactjs 带有yup验证的对象或字符串类型条件

Reactjs 带有yup验证的对象或字符串类型条件,reactjs,typescript,validation,formik,yup,Reactjs,Typescript,Validation,Formik,Yup,我在React应用程序中使用yup和Formik来验证TypeScript模型/接口。 我们之前有一个yup.object用于以下模式: export const InputSchema=yup.object({ id:yup.string(), 名称:yup.string().required().min(最小描述长度).max(最大名称长度), 描述:yup.string().required().matches(/(?!^\d+$)^[\s\s]+$/,“请输入有效的描述”).min(最小

我在React应用程序中使用
yup
Formik
来验证TypeScript模型/接口。 我们之前有一个yup.object用于以下模式:

export const InputSchema=yup.object({
id:yup.string(),
名称:yup.string().required().min(最小描述长度).max(最大名称长度),
描述:yup.string().required().matches(/(?!^\d+$)^[\s\s]+$/,“请输入有效的描述”).min(最小描述长度).max(最大描述长度),
联系人:yup.string().required()
});
当我们现在更改界面时,
名称
描述
字段可以是
字符串
对象

我仍然想用
yup
验证我的表单,所以我尝试使用
name:yup.mixed()
description:yup.mixed()
函数,但现在我发现
min.()
matches()
函数明显存在问题


是否可能存在
字符串
对象
条件?因此,如果它是一个
yup.string()
,那么将使用
min/max
,否则只需
yup.object()

,我想用一种简单的方法来实现这一点,但找不到任何方法,但他们给出的解决方案是使用

就你的情况来说

Yup.object({
    ...
    name: Yup.lazy(value => {
      switch (typeof value) {
        case 'object':
          return Yup.object(); // schema for object
        case 'string':
          return Yup.string().min(MIN_DESC_LENGTH).max(_MAX_NAME_LENGTH); // schema for string
        default:
          return Yup.mixed(); // here you can decide what is the default
      }
    }),
    ...
})
另一种方法是这样做。

它使用
.addMethod
创建一个自定义方法,该方法接收模式并验证所有模式。非常好的方法

我想用一种简单的方法来实现这一点,但找不到任何方法,但他们给出的解决方案是使用

就你的情况来说

Yup.object({
    ...
    name: Yup.lazy(value => {
      switch (typeof value) {
        case 'object':
          return Yup.object(); // schema for object
        case 'string':
          return Yup.string().min(MIN_DESC_LENGTH).max(_MAX_NAME_LENGTH); // schema for string
        default:
          return Yup.mixed(); // here you can decide what is the default
      }
    }),
    ...
})
另一种方法是这样做。
它使用
.addMethod
创建一个自定义方法,该方法接收模式并验证所有模式。很好的方法