Les problèmes de connexion React-Redux en caractères typographiques

je suis un essai de faire un composant qui passe pour la fonction connect de react-redux. La composante est la suivante:

interface ITestProps {
  id: number
}

class TestComponent extends React.Component<ITestProps, {}> {
  render() {
    return (<div>
      {this.props.name}
    </div>)
  }
}

mapStateToProps(state) {}
mapDispatchToProps(dispatch) {}

let ConnectedComponent = connect(
  mapStateToProps,
  mapDispatchToProps
)(TestComponent)

le code ci-dessus semble fonctionner trouver si je rends ConnectedComponent comme si

<ConnectedComponent></ConnectedComponent>

I. e sans le id prop. Ne devrait-il pas jeter une erreur puisque le ConnectedComponent est simplement la forme jointe de TestComponent et TestComponent devrait avoir des accessoires de la forme ITestProps . Est-ce comment il est censé se comporter ou je fais quelque chose de mal.

10
demandé sur Nahush Farkande 2016-07-07 13:54:01

3 réponses

Je ne suis pas sûr pourquoi les typographies ne peuvent pas inférer le type à partir du seul composant de présentation, mais il fonctionnera si ownProps est typé dans connect - >

let ConnectedComponent = connect<{}, {}, ITestProps>(
  mapStateToProps,
  mapDispatchToProps
)(TestComponent)

il peut aussi le déduire si ses propres gouttes sont dactylographiées dans mapDispatchToProps - >

mapStateToProps(state, ownProps: ITestProps) {}
18
répondu Radio- 2016-07-07 15:34:59

c'est le comportement correct. connect () renverra un nouveau container component qui enveloppera votre TestComponent comme un enfant.

Voici une partie du code source

class Connect extends Component {
...
    render() {
        const selector = this.selector
        selector.shouldComponentUpdate = false

        if (selector.error) {
          throw selector.error
        } else {
          return createElement(WrappedComponent, 
              this.addExtraProps(selector.props))
        }
    }
...
}

mais vous pouvez spécifier l'interface des accessoires du conteneur comme dit par Radio - (et aussi les interfaces de Staeprops et DispatchProps). Vous pouvez voir de la définition de type qui accepte TStateProps, TDispatchProps et TOwnProps, et retournera ComponentDecorator

export declare function connect<TStateProps, TDispatchProps, TOwnProps>(
    mapStateToProps?: MapStateToProps<TStateProps, TOwnProps> | MapStateToPropsFactory<TStateProps, TOwnProps>,
    mapDispatchToProps?: MapDispatchToProps<TDispatchProps, TOwnProps> | MapDispatchToPropsFactory<TDispatchProps, TOwnProps>,
    mergeProps?: MergeProps<TStateProps, TDispatchProps, TOwnProps>,
    options?: Options
): ComponentDecorator<TStateProps & TDispatchProps, TOwnProps>;
0
répondu paibamboo 2017-04-10 15:51:36

inclut un constructeur à l'intérieur de la classe comme ceci:

constructor(props) {
  super(props)
}

sans le constructeur les accessoires ne se chargent pas

au lieu de

let ConnectedComponent = connect(
  mapStateToProps,
  mapDispatchToProps
)(TestComponent)

j'ai ajouté (évidemment mapStateToProps & mapDispatchToProps doivent être définis avant la fonction connect)

@connect(mapStateToProps, mapDispatchToProps)

ci-dessus

class TestComponent extends React.Component<ITestProps, {}> {
0
répondu suku 2017-06-28 13:04:43