是的,如何验证空对象上的必填字段

时间:2020-03-13 17:27:18

标签: javascript validation yup

我在验证强制字段(存在(可能)为空对象的属性)方面遇到问题。

这是一个示例架构:

object().shape({
   catalog: {
      brand: string().required()
   }
})

如果我尝试针对此架构验证以下对象,则会得到预期的错误:品牌是必需的。据我了解,为未定义对象创建了一个默认值,该默认值模仿架构中对象的形状。这是我期望的行为,也是我想要的。

{ catalog: undefined }

// "catalog.brand is a required field"

但是对于我来说,我没有收到未定义但为null的对象。而且我不知道如何使用空值来管理相同的结果。

{ catalog: null }

// No error on catalog.brand

手动将null强制转换为undefined是不可能的,因为有充分的理由为什么我会收到null。

这里是一个代码箱,复制了我的用例:

https://codesandbox.io/s/yup-playground-tbfcj

真的很感谢您的帮助,谢谢:)

3 个答案:

答案 0 :(得分:0)

解决方案是将nullable()required()都包含在形状中。

示例

const requiredOption = Yup.object()
  .shape({
    value: Yup.string(),
    label: Yup.string(),
  })
  .nullable()
  .required('This field is required.');

答案 1 :(得分:0)

与其他答案相比,这是一种不那么令人费解的方法。这允许您将 required 指令保留在 subfield 上,无论包含它的 field 在验证时是否为空。

yup.object().shape({
  field: yup.object().shape({
    subfield: string().required(),
  }).default(undefined),
});

// Or...

yup.object().shape({
  field: yup.object().shape({
    subfield: string().required(),
  }).default(null).nullable(),
});

两者之间的一个区别是,当您在这些架构中的每一个上validate 数据并且 field 丢失时,如果您还传入 stripUnknown,在第一种情况下,该字段将从验证结果中完全删除,但在第二种情况下,该字段仍会显示,但值为 null

答案 2 :(得分:0)

尝试在您的对象架构上添加 string url = "https://dl.pstmn.io/download/version/8.9.0/win32"; HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url); req .AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip; WebResponse response = req.GetResponse();

strict()