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

Object or String type conditional with yup validation

我在我的 React 应用程序中结合使用 yupFormik 来验证 TypeScript model/interface。 我们之前有一个 yup.object 用于以下模式:

export const InputSchema = yup.object({
  id: yup.string(),

  name: yup.string().required().min(MIN_DESC_LENGTH).max(_MAX_NAME_LENGTH),

  description: yup.string().required().matches(/(?!^\d+$)^[\s\S]+$/, 'Please enter a valid description').min(MIN_DESC_LENGTH).max(_MAX_DESC_LENGTH),

  contact: yup.string().required()
});

由于我们现在更改了界面,namedescription 字段可以是 stringobject

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

是否可以有 stringobject 条件?所以如果它是 yup.string() 那么, min/max 将被使用,否则只是 yup.object().

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

你的情况是

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
      }
    }),
    ...
})

另一种方法是这样 gist
它使用 .addMethod 创建一个自定义方法,该方法接收模式并验证所有模式。相当不错的方法