我需要在我的减速器中验证类似字典的对象,但由于我已经在使用 Babel,所以我不想求助于 Typescript 等工具。
以此对象为例:
posts : {
byId : {
"post1" : {
id : "post1",
author : "user1",
body : "......",
comments : ["comment1", "comment2"]
},
"post2" : {
id : "post2",
author : "user2",
body : "......",
comments : ["comment3", "comment4", "comment5"]
}
}
allIds : ["post1", "post2"]
}
我该如何表达我的期望byId使用 PropTypes 的对象?是否可以?如果是这样,怎么办?
如果您无法实现您想要的目标,您可以编写自定义道具类型检查器PropTypes
' 内置属性类型。
如果你想要的所有值byId
成为具有属性的对象id
, author
, body
and comments
, 您可以使用shape
, objectOf
, and arrayOf
。如果你想allIds
包括所有的键byId
您可以编写自定义验证器:
posts: PropTypes.shape({
byId: PropTypes.objectOf(PropTypes.shape({
id: PropTypes.string,
author: PropTypes.string,
body: PropTypes.string,
comments: PropTypes.arrayOf(PropTypes.string)
})),
allIds(props, propName, componentName) {
if(!Object.keys(props.byId).every(postID => props[propName].includes(postID))) {
return new Error('allIds must include all the ids provided to byId!');
}
}
})
上面使用了形状,所以它期望posts
带有键的对象byId
and allIds
。它期望byId
成为具有属性的对象values也可以是一个形状的对象,id
, author
and body
是字符串,与comments
是一个字符串数组。最后,它使用自定义 proptype 验证器来检查是否每个键都在byId
(帖子 ID)存在于allIds
。如果没有,则抛出错误。但请注意,这不包括以下情况allIds
包含不存在的帖子 IDbyIds
. See 如何知道两个数组是否具有相同的值 https://stackoverflow.com/q/6229197/5647260了解更多解决方案。你可以加isRequired
在必要时。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)