是否可以使用PropTypes来验证类字典对象?

时间:2017-06-29 22:34:32

标签: reactjs react-proptypes

我需要在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 对象的期望?可能吗?如果是这样,怎么样?

2 个答案:

答案 0 :(得分:6)

如果您无法通过PropTypes'来实现您的目标,那么您可以编写自定义的proptype检查程序。内置的proptypes。

如果您希望byId的所有值都是包含属性idauthorbodycomments的对象,则可以使用shapeobjectOfarrayOf。如果您希望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对象,其键为byIdallIds。它希望byId是一个对象,其属性也是一个形状的对象,其中idauthorbody是字符串,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
}),