如何在流中键入检查类似Redux的connect()函数

时间:2017-09-15 18:48:01

标签: javascript reactjs flowtype

所以我做了一个项目,在那里我基本上编写了自己的Redux版本,并且我试图做一些非常复杂的打字,而且我不确定Flow是否有能力处理它。也许我做错了什么,但如果我能让它发挥作用,那将是非常优雅的。

这是我的connect功能

// @flow
// TODO: think about how to make this more efficient, since forceUpdate on every subscribe will get inefficient

import React, { PureComponent } from 'react';

import type { Store } from './getStore';

function connectToStore<StateType, MappedProps: Object, PassedProps: Object>(
  store: Store<StateType>, 
  mapStateToProps: (StateType) => MappedProps, 
  OldComponent: (PassedProps & MappedProps) => React$Element<*>
) {
  return class Connected extends PureComponent<PassedProps, { storeState: StateType }> {
    unsubscribe: () => void;

    constructor(props: PassedProps, context: any) {
      super(props, context);
      this.state = {
        storeState: store.getState()
      };
      this.unsubscribe = store.subscribe((state) => this.setState({ storeState: state }));
    }

    componentWillUnmount() {
      this.unsubscribe();
    }

    render() {
      const mappedProps = mapStateToProps(this.state.storeState);
      return React.createElement(OldComponent, { ...this.props, ...mappedProps });
    }
  };
}

export default connectToStore;

所以应该发生的是,这个组件的输入应该使它如果我在组件C上调用这个函数,那么它将评估C的道具并检查以确保传递到组件中的道具与mapStateToProps中的道具满足C的每个道具要求。

然而,所发生的事情基本上都没有类型检查。我不必填写C的任何道具要求(既不在mapToProps函数中,也不在从直接父项传入的道具中),并且流程无论如何都接受它。这是否超出流量的能力?或者我错过了什么?

1 个答案:

答案 0 :(得分:-1)

你只是想使用像Angular这样的好框架