我需要在reducers中验证类似字典的对象,但由于我已经在使用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"]
}
我如何使用PropTypes表达对 byId 对象的期望?可能吗?如果是这样,怎么样?
答案 0 :(得分:6)
如果您无法通过PropTypes
'来实现您的目标,那么您可以编写自定义的proptype检查程序。内置的proptypes。
如果您希望byId
的所有值都是包含属性id
,author
,body
和comments
的对象,则可以使用shape
,objectOf
和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
和allIds
。它希望byId
是一个对象,其属性值也是一个形状的对象,其中id
,author
和body
是字符串,comments
是一个字符串数组。最后,它使用自定义proptype验证器来检查byId
中是否存在allIds
中的每个键(帖子ID)。如果没有,则抛出错误。但请注意,这不会涵盖allIds
发布byIds
中不存在的帖子ID的情况。有关更多解决方案,请参阅How to know if two arrays have the same values。您可以在必要时添加isRequired
。
答案 1 :(得分:-2)
使用PropTypes.shape()
posts: PropTypes.shape({
byId: PropTypes.sth() // could be shape() or sth else
}),