首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取propType名称、类型和isRequired

获取propType名称、类型和isRequired
EN

Stack Overflow用户
提问于 2015-11-18 21:20:58
回答 3查看 2.1K关注 0票数 3

我注意到react组件有一个type.propTypes对象,它将所有propTypes作为键保存。

例如,

代码语言:javascript
复制
Component.propTypes = { initialCount: React.PropTypes.number }

看起来像

在Chrome开发工具中。这样,我就可以使用

代码语言:javascript
复制
Object.keys(component.type.propTypes)

但我也能得到丙型类型和它是否需要吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-11-18 22:48:13

不怎么有意思。如果您检查ReactPropTypes.js,则导出的验证方法在私有范围内使用expectedType

看看ReactElementValidator.js是如何调用propType验证的,这也很有趣。

如果您想要针对原语类型进行测试,您可能可以使用假道具迭代验证方法的调用,并捕获错误,直到它不抛出为止,但我认为这不是您想要的结果。

票数 3
EN

Stack Overflow用户

发布于 2015-11-20 12:53:18

下面的函数根据propTypes答案提取@M_rivermount:s的名称、类型和isRequired。

代码语言:javascript
复制
var extractPropTypes = (component) => {
  let propTypes = component.type.propTypes;
  let propNames = Object.keys(propTypes);

  let extractPropType = (propTypes, propName) => {
      let fakeProps = {};
      fakeProps[propName] = "dummy";
      let error = propTypes[propName](fakeProps, propName);
      if (error === null) {
          return "string";
      } else {
          const EXPECTED_TYPE_PATTERN = /expected `(\w+)`/i;
          return error.toString().match(EXPECTED_TYPE_PATTERN)[1];
      }
  };

  let extractPropIsRequired = (propTypes, propName) => {
      let fakeProps = {};
      fakeProps[propName] = null;
      let error = propTypes[propName](fakeProps, propName);
      return !!error;
  };

  return propNames.map(function (propName) {
      return {
          name: propName,
          type: extractPropType(propTypes, propName),
          isRequired: extractPropIsRequired(propTypes, propName)
      }
  });
};
票数 2
EN

Stack Overflow用户

发布于 2018-10-13 10:38:10

使用propTypes API 变化,不能直接调用PropTypes验证器。可以使用Proptype的checkPropTypes方法手动检查类型。

而且,checkPropTypes不返回任何结果,而只是将警告记录到控制台。因此,要从类型检查中检索错误,检查支柱类型是救星。(尽管facebook/prop类型( 这里 )有一个允许从checkPropTypes外部日志记录的PR )

以下是@Theodor片段的更新版本(略有更改):

代码语言:javascript
复制
import checkPropTypes from 'check-prop-types';

getPropType(propTypes, propName) {
    let fakeProps = {};
    fakeProps[propName] = "dummy";

    let error = checkPropTypes(propTypes, fakeProps, 'prop');

    // extract type from error string
    if (error !== undefined) {
        const EXPECTED_TYPE_PATTERN = /expected (\w+)/i;
        return error.toString().match(EXPECTED_TYPE_PATTERN)[1];
    } else {
        // no error - it is string
        return 'string';
    }
}

getPropIsRequired(propTypes, propName){
    let fakeProps = {};
    fakeProps[propName] = null;
    let error =  checkPropTypes(propTypes,fakeProps);
    return !!error;
};

extractTypes(component) {
    let type_map = {};
    let propTypes = component.type.propTypes;
    Object.keys(propTypes).forEach((propName) => {
    let type = getPropType(propTypes, propName);
    let required = getPropsIsRequired(propTypes, propName)
    type_map[propName]= {
        type:type,
        required:required
        }
    });
    return type_map;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33790631

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档