当前位置: 首页 > 知识库问答 >
问题:

使用PropType检查嵌套对象属性

龚同
2023-03-14

我想用flow注释以下内容:

type PropType = {
  content: Object
};

export const DialogContent = ({ content }: PropType) => (
  <div>
    <p className={cn('text-head')}>{content.h4}</p>
    <p className={cn('text-bottom')}>
      {content.p}
    </p>
  </div>
);

我知道如何对进行类型检查,以使内容的类型为对象(如上所示),但如何对其属性进行类型检查?

已经尝试过这个:

  type PropType = {
  content: {
    p: string,
    h4: string
  }
};

但是flow只是抱怨从未使用过ph4

共有2个答案

卫浩瀚
2023-03-14

我知道这个问题和答案非常古老,但我认为我们应该添加当前使用道具类型进行类型检查的标准方法,这更简单:

import PropTypes from 'prop-types';

class DialogContent extends React.Component {

  static propTypes = {
    content: PropTypes.shape({ p: PropTypes.string, h4: PropTypes.string })
  };

  render() {
    const { p, h4 } = this.props.content;

    return (
      <div>
        <p className='text-head'>{h4}</p>
        <p className='text-bottom'>
          {p}
        </p>
      </div>
    )
  }
}

export default DialogContent;

您还可以通过在其类型定义后添加isRequired来设置内容或其必填字段。例如,对于内容:

static propTypes = {
    content: PropTypes.shape({ p: PropTypes.string, h4: PropTypes.string }).isRequired
};
柳坚白
2023-03-14

因此,您希望发送类型为object的道具,该道具必须具有属性ph4

如果不编写执行此检查的自定义函数,这是不可能的。为此,您需要声明您的propTypes,如下所示:

propTypes: {
  content: function(props, propName, componentName) {
    //do your validation here. 
    //Return an Error if something's wrong, otherwise don't return anything (or return null).
  }
}

官方文件是这样说的:

您还可以指定自定义验证器。如果验证失败,它应该返回一个错误对象。不要控制台。警告或抛出[…]

阅读有关在官方文档中使用PropType进行打字检查的更多信息。

这是我准备的演示。对于你正在寻找的东西来说,这可能是也可能不是过分的,因为验证是相当广泛的。你可以挑你需要的。以下是您的内容的验证(按顺序):

  • 验证道具内容是否通过
  • 验证道具内容是否为对象
  • 验证道具内容的对象属性是否为p
  • 验证道具内容的对象属性为h1
  • 验证对象属性内容。p是一个字符串
  • 验证对象属性内容。h1是一个字符串
var DialogContent = React.createClass({
  propTypes: {
    content: function(props, propName, componentName) {
      if (!props.content) {
        return new Error(
          'Required prop `' + propName + '` was not specified in `' + componentName + '`.'
        );
      } else if (typeof props.content !== 'object') {
        return new Error(
          'Invalid prop `' + propName + '` of type `' + typeof props.content + '` supplied to `' + componentName + '`, expected `object`.'
        );
      } else if (!props.content.p) {
        return new Error(
          'Required prop `p` of object `' + propName + '` was not specified in `' + componentName + '`.'
        );
      } else if (!props.content.h1) {
        return new Error(
          'Required prop `h1` of object `' + propName + '` was not specified in `' + componentName + '`.'
        );
      } else if (typeof props.content.p !== 'string') {
        return new Error(
          'Invalid object property `p` of prop `' + propName + '` of type `' + typeof props.content.p + '` supplied to `' + componentName + '`, expected `string`.'
        );
      } else if (typeof props.content.h1 !== 'string') {
        return new Error(
          'Invalid object property `h1` of prop `' + propName + '` of type `' + typeof props.content.h1 + '` supplied to `' + componentName + '`, expected `string`.'
        );
      }
    }
  },

  render: function() {
    return <div>My DialogContent Component</div>;
  }
});

var obj = {
  p: "foo",
  h1: "bar"
};

ReactDOM.render(<DialogContent content={obj} />,
  document.getElementById('container')
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>

<div id="container"></div>

 类似资料:
  • 问题内容: 我有以下我想用流程注释的内容: 我知道该怎么做了类型检查,这样的类型的(如上图所示),但我怎么能型检查其属性呢? 已经尝试过: 但是随后流程只是抱怨而从未使用过。 问题答案: 因此,您要发送类型为的道具,该道具必须具有属性和? 如果没有编写执行此检查的自定义函数,则无法实现。为此,您需要这样声明: 这是官方文档所说的: 您还可以指定一个自定义验证器。如果验证失败,它将返回一个Error

  • 我有一些文档在嵌套对象中有嵌套对象: 在这里,主文档有几个嵌套的对象(标记),对于每个标记有几个嵌套的对象(事件)。 我希望获得transfer_processed类型的事件在transfer类型的标记之后60000毫秒内发生的所有文档。为此,我需要查询tags.at、tags.type、tags.events.at和tags.events.type。我不知道如何查询:我只查询tags.event

  • 让我们考虑一下这些帖子的集合。每个帖子都有一个评论数组,每个评论都有一个字符串数组,带有键“likes”,表示喜欢该评论的用户。 如何使用mongoose检查用户是否喜欢具有给定ID的评论?

  • 有了jOOQ惊人的多集算子,我们能够查询嵌套列表并将其映射到pojo对象。现在,我试图找到一种方法来同时映射单个嵌套对象。例如,我有一个组合的自定义pojo类,如: 我想在一个步骤中查询并获取它。因此,我目前的工作解决方案是: 这包括一个预初始化的字段列表,其目的是以某种方式告诉JOOQ从“教师”映射教师对象。*”列。 我现在想知道在这方面是否有更直观的解决方案。我曾尝试使用row运算符,但到目前

  • 尊敬的弹性搜索专家, 我在查询嵌套对象时遇到问题。允许使用以下简化映射: 并将一些文档放在索引中: 现在我想执行这样的查询: 因此,我想得到匹配的公司与数量匹配的文件。因此,上面的查询应该会告诉我: 以下查询: 应该给我所有公司分配到一个文件,其标题包含“GPU”与匹配的文件数量: 如果表现良好,是否有可能实现这一结果?我显然对匹配的文档不感兴趣,只对匹配文档和嵌套对象的数量感兴趣。 谢谢你的帮助

  • 问题内容: 我有一些文档在嵌套对象中具有嵌套对象: 在这里,主文档有几个嵌套对象(标签),每个标签有几个嵌套对象(事件)。 我想获得的所有地方类型的事件文件 transfer_processed 类型的标签后发生60000毫秒 转移 。为此,我需要同时查询 tag.at , tags.type , tags.events.at 和 tags.events.type 。而且我不知道怎么做:我只设法对