我在验证强制字段(存在(可能)为空对象的属性)方面遇到问题。
这是一个示例架构:
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
真的很感谢您的帮助,谢谢:)
答案 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()