Reacts`propTypes`和`defaultProps`应该与Flowtype一起使用,还是Flowtype足够全面?

时间:2016-04-22 02:53:15

标签: javascript reactjs flowtype react-proptypes

想到一个简单的例子,例如:

class CommentAreaComponent extends React.Component {
static propTypes = {
    id: PropTypes.string.isRequired,
    loading: PropTypes.bool,
};

static defaultProps = {
    loading: false,
};

在构造函数中,我可以定义类似的东西来实现(我认为)同样的事情:

class MyComponent extends React.Component {
    constructor({
        loading = false,
    }:{ 
        id:string, 
        loading?:boolean 
    }) {
        super(arguments[0]);
    }
}

第二个例子是仅使用Flowtype。使用Reacts PropTypes和DefaultProps是否有优势?或者我可以在使用FlowType时完全删除它们吗?

2 个答案:

答案 0 :(得分:7)

您肯定可以使用Flow类型而不是React PropTypes,但您提出的语法并不常见。请参阅Flow docs(向下滚动以查看ES6语法):

class Button extends React.Component {
  props: {
    title: string,
    visited: boolean,
    onClick: () => void,
  };

  state: {
    display: 'static' | 'hover' | 'active';
  };

  static defaultProps = {
    visited: false,
  };

  constructor(props) {
    super(props);
    this.state = {
      display: 'static',
    };
  }

  render() {
    let className = 'button ' + this.state.display;
    if (this.props.visited) {
      //...
    }

    return (/*...*/);
  }
}

您可以使用PropTypes对Flow类型做的唯一事情是定义custom validators(例如,检查道具是否是有效的电子邮件)。

我有更多Flow React examples on github,但我还没有使用Flow v0.22测试它们,只有v0.21。他们可能需要稍作调整。

答案 1 :(得分:3)

作为一般规则,Flow的静态分析将为您提供更大的力量和更大的覆盖面,因此优于propTypes

然而,propTypes仍然很好,如果您可能是通过多个组件传播对象,或者在其他动态运行时场景中道具可能没有您期望的值。

考虑使用https://github.com/brigand/babel-plugin-flow-react-proptypes

充分利用两者

注意:我不隶属于此库。