2016-07-20 12 views
2

erfordert ich habe folgendes Beispiel:Redux, Reaktion, Typoskript: Verbinden Sie kehrt ansehen Klasse, die Requisiten

import * as React from "react"; 
import { connect } from 'react-redux'; 


interface IMessage { 
    message : string; 
} 

class SayMessage extends React.Component<IMessage, {}>{ 
    render() { 
     return (<div>{this.props.message}</div>); 
    } 
} 


function mapStateToProps(state : any) : IMessage { 
    return { message : "Hello, world" }; 
} 
const SayMessageContainer = connect(mapStateToProps)(SayMessage); 

export class SomeOtherView extends React.Component<{},{}>{ 
    render(){ 
     return (<SayMessageContainer/>); 
    } 
} 

die auf <SayMessageContainer/> wirft:

Property 'message' wird in Typ fehlt ‚IntrinsicAttributes & IntrinsicClassAttributes & IMessage & {Kinder ?: ReactElement ... '.

Wie sollte dieses Beispiel geändert werden, damit Connect die Requisiten über mapStateToProps bereitstellen kann?

Hinweis/möglicher Hinweis: SayMessageContainer ist typeof SayMessage, was mir scheint.

Typoskript 2.0.0

bearbeiten

meine eigenen Container Schreiben scheint es zu lösen, aber ich würde lieber herausfinden, wie es richtig connect

class SayMessageContainer extends React.Component<{},{}>{ 
    render() { 
     const props = mapStateToProps({}); 
     return (
      <SayMessage {...props}/> 
     ); 
    } 
} 

mit zu tun Bearbeiten 2 Verwenden Sie die folgenden Typen:

"react-redux": "registry:npm/react-redux#4.4.0+20160614222153", 
"react-router": "registry:npm/react-router#2.4.0+20160628165748", 
"react-router-redux": "registry:npm/react-router-redux#4.0.0+20160602212457", 
"redux": "registry:npm/redux#3.0.6+20160214194820" 
+0

Welche Typisierungen verwenden Sie? Die in DefinitelyTyped oder in npm? –

+0

"react-redux": "registrierung: npm/react-redux # 4.4.0 + 20160614222153", "react-router": "registrierung: npm/react-router # 2.4.0 + 20160628165748", "reagieren- router-redux ":" registrierung: npm/react-router-redux # 4.0.0 + 20160602212457 ", " redux ":" registrierung: npm/redux # 3.0.6 + 20160214194820 " –

+0

Nach den neuesten [typings] (https://github.com/andrew-w-ross/typings-react-redux/blob/master/react-redux.d.ts), das Ergebnis von' connect (...) '(' wrapWithConnect') ist eine Funktion mit dem Prototyp 'T -> T' (mit' T extends React.ComponentConstructor '), was dazu führt, dass der resultierende Komponentenkonstruktor denselben Satz von Requisiten erwartet, unabhängig davon, was connector wrapper.Während dieses Problem nicht behoben wird, müssen Sie möglicherweise manuell behandeln. Siehe auch dieses Problem: https://github.com/reactjs/react-redux/issues/290 –

Antwort

0

Was ich tue ist Typ ownProps auf entweder mapStateToProps oder verbinden. Wenn Sie Requisiten hatte möchten Sie die Eltern schicken wie -

interface IMyOwnProps{ 
    thing1; 
    thing2; 
} 

dann können Sie Typoskript Figur, die aus durch verbinden Aufruf wie so helfen ...

const SayMessageContainer = connect<{}, {}, IMyOwnProps>(mapStateToProps)(SayMessage); 

Typing ownProps auf mapStateToProps auch ausreichend ist. In Ihrem Fall, da Sie keine Requisiten nicht haben, kann es ausreichend sein, um die folgenden zu tun, aber ich kann es nicht zur Zeit testen:

const SayMessageContainer = connect<{},{},{}>(mapStateToProps)(SayMessage); 
+0

Connect löst einen Fehler in meiner Umgebung aus: "Mitgelieferte Parameter stimmen mit keiner Signatur des Anrufziels überein. (Alias) connect (mapStateToProps ?: ReactRedux.IMapStateToProps, mapDispatchToProps ?: ReactRedux.IMapDispatchToProps | Object, mergeProps ?: (stateProps: Objekt, dispatchProps: Object, ownProps: Object) => Objekt, Optionen ?: ReactRedux.IConnectOptions): (Komponente: T) => T (+1 Überladung) " –

4

Sie haben eine Schnittstelle für jede Art zu schaffen, die Requisiten und gibt sie dann an die connect-Methode:

// Regular props 
interface OwnProps {} 

// Props from the mapStateToProps method 
interface StateProps { 
    message: string; 
} 

// Props from the mapDispatchToProps method 
interface DispatchProps {} 

Ihre Komponente zu erstellen, Sie eine bestimmte Art verwenden können:

type SayMessageProps = OwnProps & StateProps & DispatchProps; 

class SayMessage extends React.Component<SayMessageProps, {}>{ 
    render() { 
     return (<div>{this.props.message}</div>); 
    } 
} 

dann bei Verwendung verbinden:

connect<StateProps, DispatchProps, OwnProps>(mapStateToProps)(SayMessage); 

(Sie können auch mit {} statt leerer Schnittstellen)

+0

Ich bekomme den gleichen Fehler wie Andrew bei der Verwendung von' connect' wie folgt. "Mitgelieferte Parameter stimmen nicht mit einer Signatur des Aufrufziels überein. (alias) connect (mapStateToProps ?: ReactRedux.IMapStateToProps, mapDispatchToProps ?: ReactRedux.IMapDispatchToProps | Object, mergeProps ?: (stateProps: Objekt, dispatchProps: Objekt, ownProps: Objekt) => Objekt, Optionen ?: ReactRedux.IConnectOptions): < T erweitert React.ComponentClass | React.StatelessComponent > (Komponente: T) => T (+1 Überladung) " –

+0

verwenden Sie Dekorateur? – Neo