如何动态扩展或组合 Yup 模式

How to dynamically extend or compose a Yup schema

假设我有一个 Yup.string() 作为开头。

然后,在某个时候,就像在循环中一样,我想向其中添加 required 规则,有效地:

Yup.string().required('This field is required').

也许然后再添加一些 .email 检查。

我试过这种方法,但似乎没有用:

function validationSchemaConstructor(question) {
  const schema = Yup.string();

  question.validation_rules.forEach(rule => {
    if ("is_required" in rule) {
      schema.required("Hey man nice shot");
    }
  });

  return schema;
}

啊我的错误 - 我需要再次分配 schema 因为链接通常通过再次返回对象来工作:

function validationSchemaConstructor(question) {
  let schema = Yup.string();

  question.validation_rules.forEach(rule => {
    if ("is_required" in rule) {
      schema = schema.required("Hey man nice shot");  // mistake here!
    }
  });

  // un-comment to test dynamically adding additional rule
  // schema = schema.email("email plesss");

  return schema;
}

虽然不确定我是否应该在某处使用 clone()

如果有更好的方法请指教:)