2017-05-31 2 views
0

Bearbeiten erneut auszuwählen. Typescript-Compiler besteht darauf, die erste Definition der createSelector-Funktion zu importieren und erkennt nicht, dass die Signatur meiner Funktion einer anderen Definition entspricht.Assign richtige Typen createSelector Funktion

Die Definition es importiert:

export function createSelector<S, R1, T>(
    selector: Selector<S, R1>, 
    combiner: (res: R1) => T, 
): OutputSelector<S, T, (res: R1) => T>; 

Der, den ich verwenden möchten:

export function createSelector<S, R1, R2, T>(
    selectors: [Selector<S, R1>, 
       Selector<S, R2>], 
    combiner: (res1: R1, res2: R2) => T, 
): OutputSelector<S, T, (res1: R1, res2: R2) => T>; 

Hier ist meine eigentliche Code ist:

// groups.selectors.tsx 

import { Selector, createSelector } from 'Reselect'; 
import { IGroup, IQuestionnaire, IGroupReselect, IState } from '../interfaces'; 

const getGroups:Selector<IState, IGroup[]> = state => state.groups; 
const getQuestionnaires:Selector<IState, IQuestionnaire[]> = state => state.questionnaires; 

export const groups = createSelector<IState, IGroup[], IQuestionnaire[], IGroupReselect>(
    [getGroups, getQuestionnaires], 
    (g, q) => { 

    return g.map(group => Object.assign(
     {}, 
     group, 
     {questionnaires: group.questionnairesIds.map(id => q.find(q => q.id === id))} 
    )); 
    } 
); 

Und wenn ich es sein, jede Hilfe, hier ist meine ts.config:

Ich bin nicht völlig mit TypScript vertraut, so ist sicherlich etwas falsch in meiner Implementierung. Was mich ärgert, ist, dass wenn ich den einfachsten möglichen Reselektor schreibe, also einen mit nur einem Selektor und einem Kombinierer mit Arity 1, die Typprüfung besteht, was den Eindruck erweckt, dass der Compiler die richtige Definition unter überladenen Funktionen nicht richtig auswählt Reselect des index.d.ts

Hier sind relevante Teile meines package.json:

"dependencies": { 
    "react": "^15.5.4", 
    "react-dom": "^15.5.4", 
    "react-redux": "^5.0.5", 
    "react-router": "^4.1.1", 
    "react-router-dom": "^4.1.1", 
    "redux": "^3.6.0", 
    "redux-devtools-extension": "^2.13.2", 
    "redux-thunk": "^2.2.0", 
    "reselect": "^3.0.1" 
    }, 
    "devDependencies": { 
    "@types/react": "^15.0.25", 
    "@types/react-router-dom": "^4.0.4", 
    "@types/redux-thunk": "^2.1.0", 
    "typescript": "^2.3.3" 
    }, 
+0

verursacht funktioniert würde ich zunächst prüfen, um zu sehen, dass Sie die Version von Reselect des index.d.ts haben, die Sie verknüpft. Unterstützung für Arrays von Selektoren wurde erst kürzlich hinzugefügt (Version 3.0, denke ich). Sie könnten das Array komplett weglassen; Es ist nicht erforderlich, erneut zu wählen (obwohl die meisten Beispiele es verwenden.) –

+0

Es könnte tatsächlich ein Problem mit meinen Abhängigkeiten Versionen sein. Was Array-Selektoren betrifft, starte ich erneut 3.0.1, also sollte es kein Problem sein. –

Antwort

0

ich könnte falsch sein, aber von diesen this issue, so scheint es durch verursacht werden, wie die Sprache folgert Ihr heterogenes Array [getGroups, getQuestionnaires] als Array und kein Tupel.

das erste Argument Erzwingen Typ Tupel wird es aber nicht notwendig vorformulierten

const getGroups:Selector<IState, IGroup[]> = state => state.groups; 
const getQuestionnaires:Selector<IState, IQuestionnaire[]> = state => 
    state.questionnaires; 

const selectors: [Selector<IState, IGroup[]>, Selector<IState, IQuestionnaire[]>] = [getGroups, getQuestionnaires] 

export const groups = createSelector<IState, IGroup[], IQuestionnaire[], IGroupReselect>(
    selectors, 
    (g, q) => { 

    return g.map(group => Object.assign(
     {}, 
     group, 
     {questionnaires: group.questionnairesIds.map(id => q.find(q => q.id === id))} 
    )); 
    } 
); 
+0

Dieser Vorschlag löst das Problem nicht. –