当前位置: 首页 > 面试题库 >

使用PropType对嵌套对象属性进行类型检查

颜经艺
2023-03-14
问题内容

我有以下我想用流程注释的内容:

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>
);

我知道该怎么做了类型检查,这样content的类型的Object(如上图所示),但我怎么能型检查其属性呢?

已经尝试过:

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

但是随后流程只是抱怨ph4从未使用过。


问题答案:

因此,您要发送类型为的道具,该道具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).
  }
}

这是官方文档所说的:

您还可以指定一个自定义验证器。如果验证失败,它将返回一个Error对象。不要console.warn或抛出[…]

官方文档中 阅读有关使用PropTypes进行类型检查的更多信息。

演示版

这是我准备的演示。由于验证的范围很广,因此它对于您正在寻找的内容可能会或可能不会过大。您可以选择需要的东西。以下针对您的验证为content(按顺序):

  • 验证道具content已通过。
  • 验证道具contentobject
  • 验证道具content的对象属性为p
  • 验证道具content的对象属性为h1
  • 验证object属性content.p是否为string
  • 验证object属性content.h1是否为string
    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>

您也可以在此 Fiddle
上对其进行测试并进行一些模拟。尝试更改传递到组件中的值,类型和对象属性,然后读取控制台输出。

希望这可以帮助。祝好运!



 类似资料:
  • 我想用flow注释以下内容: 我知道如何对进行类型检查,以使的类型为(如上所示),但如何对其属性进行类型检查? 已经尝试过这个: 但是flow只是抱怨从未使用过和。

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

  • 问题内容: 我需要通过对象属性之一的一个属性比较对象数组。 我在做 : 它没有编译,有人知道怎么做吗? 谢谢。 问题答案: 这是代码中导致错误的部分 您可以创建对特定类型的任意对象的(静态或非静态)方法的引用。对任何类型的对象的方法的引用如下所示: 但是方法引用不是对象,并且没有成员可以访问。使用此代码,您尝试访问引用的成员变量(并且不能) 另外,方法引用不是类,因此您不能从它们中获取另一个方法引

  • 我是Java流的新手,我只想对我的对象的键进行排序。 所以,我尝试了这样的方法,效果很好 这是根据我想要的分类。 但我得到的结果在

  • 我正在尝试反序列化一个 JSON 响应,其中包含一些标准字段和一个包含子类属性的 嵌套对象,例如: 字段< code>id和< code>type是标准的,所以我有一个基类< code>Base,然后扩展一些更具体的类: 如何让杰克逊读取 对象作为进一步字段值的来源?我假设我需要创建一个自定义反序列化程序,但我不确定如何具体完成此操作。