TypeScript 2.6 introduced strictFunctionTypes
, und nach dem Upgrade, ich kann nicht scheinen, Redux und React Router zu bekommen, nett mit ihm und einander zu spielen. Daher frage ich mich, wie man die Typen für eine Komponente, die auf einer bestimmten Route angezeigt werden soll, am besten definieren und Requisiten von Redux erhalten kann.Wie kann man TypeScript `strictFunctionTypes` mit React Router und Redux abgleichen?
Im Folgenden erfahren Sie, wie ich meine Anwendung eingerichtet habe. Es gibt eine Route wie folgt aus:
<Route path="/some/path/with/:parameter" component={ConnectedComponent}/>
Dann wird die Komponente, die ich angezeigt werden soll empfängt Requisiten von beiden Redux und Reagieren Router, die ich versucht habe, in der folgenden Art Signatur zu erfassen:
class BareComponent extends React.Component<ReduxProps & RouteProps, ArbitraryState>
... wo die Redux Requisiten ähnlich wie folgt definiert sind:
interface StateProps { storeProperty: string; }
interface DispatchProps { dispatchCallback:() => void; }
type ReduxProps = StateProps & DispatchProps;
... und der Router Requisiten etwas wie folgt aus:
interface RouteParams { parameter: string }
type RouteProps = RouteComponentProps<RouteParams>;
(wobei RouteComponentProps
aus react-router-dom
importiert)
Die Komponente, die an den Router übergeben wird (via Route
in dem ersten Code-Beispiel oben) erstellt wird, wie folgt:
const ConnectedComponent = connect<StateProps, DispatchProps, RouteProps, ArbitraryStateInterface>(mapStateToProps)(BareComponent);
Leider mit strictFunctionTypes
, dies führt TypeScript zu beschweren, dass ConnectedComponent
nicht dem Typ React Router zugeordnet werden kann:
TS2322: Type '{ path: "/some/path/with/:parameter"; component: ComponentClass<Pick<StatePr...' is not assignable to type 'IntrinsicAttributes & IntrinsicClassAttributes<Route> & Readonly<{ children?: ReactNode; }> & Rea...'.
Type '{ path: "/some/path/with/:parameter"; component: ComponentClass<Pick<StatePr...' is not assignable to type 'Readonly<RouteProps>'.
Types of property 'component' are incompatible.
Type 'ComponentClass<Pick<StateProps & DispatchProps & RouteC...' is not assignable to type 'StatelessComponent<RouteComponentProps<any> | undefined> | ComponentClass<RouteComponentProps<any...'.
Type 'ComponentClass<Pick<StateProps & DispatchProps & RouteC...' is not assignable to type 'ComponentClass<RouteComponentProps<any> | undefined>'.
Types of parameters 'props' and 'props' are incompatible.
Type 'RouteComponentProps<any> | undefined' is not assignable to type 'Pick<StateProps & DispatchProps & RouteComponentProps<R...'.
Type 'undefined' is not assignable to type 'Pick<StateProps & DispatchProps & RouteComponentProps<R...'.
Type 'undefined' is not assignable to type 'Pick<StateProps & DispatchProps & RouteComponentProps<R...'.
Also, was in der Art, wie ich die oben genannten Typen definiere, stimmt nicht mit der Art überein, wie die Typen verwendet werden sollen? Gibt es eine Möglichkeit für mich, strictFunctionTypes
zu aktivieren, ohne auf die Verwendung von any
s zurückgreifen zu müssen?
Hmm, also tauchte ich etwas mehr in 'withRouter' ein, aber ich glaube nicht, dass das mein Problem löst? Soweit ich sehen kann, übergibt "withRouter" einfach die Requisiten des Routers an die angeschlossene Komponente, aber macht "" (an die es übergeben wird) dasselbe? Warum würde '' (oder seine Typdefinitionen) eine Komponente erwarten, die in 'withRouter' verpackt ist? –
Vincent