2017-09-27 4 views
0

Ich versuche, eine .map Funktion in einen Zustand Array in Redux mit Typoskript zu tun, ist das Problem, dass esProperty-ID auf Typ existiert nicht ‚nie‘

[ts] Property ein Fehler vorliegt werfen ' id‘existiert nicht auf Typ‚nie‘

in der landing.id if-Anweisung, da seine ein Array von Objekten der Code für mich Sinn macht, aber scheint, dass ich etwas fehlt es

export default function landingReducer (state = [], action) { 
switch(action.type) { 
    case ActionTypes.ADD_LANDING: 
    return [...state, action.landing] 
    case ActionTypes.EDIT_LANDING: 
    return state.map(landing => { 
     if (action.landing.id == landing.id) { 
     return landing; 
     } 
    }) 

Vielen Dank im Voraus!

Antwort

1

Es ist wahrscheinlich wegen Typen für die state fehlt und/oder action Argumente. Versuchen Sie diesen Code, der mit Typoskript 2.4+, inspiriert von diesem article funktionieren sollte:

interface Landing { 
    id: any; 
} 

enum ActionTypes { 
    ADD_LANDING = "ADD_LANDING", 
    EDIT_LANDING = "EDIT_LANDING", 
    OTHER_ACTION = "__any_other_action_type__" 
} 

interface AddLandingAction { 
    type: ActionTypes.ADD_LANDING; 
    landing: Landing; 
} 

interface EditLandingAction { 
    type: ActionTypes.EDIT_LANDING; 
    landing: Landing; 
} 

type LandingAction = 
    | AddLandingAction 
    | EditLandingAction; 

function landingReducer(state: Landing[], action: LandingAction) { 
    switch (action.type) { 
     case ActionTypes.ADD_LANDING: 
      return [...state, action.landing] 

     case ActionTypes.EDIT_LANDING: 
      return state.map(landing => { 
       if (action.landing.id === landing.id) { 
        return landing; 
       } 
      }); 
    } 
} 
+0

wirklich zu schätzen, es funktionierte gut und gelöst mir auch einige Fragen, die ich hatte über Typoskript (ich damit fange). Danke, Mann! –

0

Ihr Code fehlt Klammern und andere notwendige Importe, die es für jemand anderen schwierig macht, schnell reproduce and diagnose.

Davon abgesehen, folgert die Maschinenschrift state Parameter wie der Typ eines leeren Arrayliteral [], die never[] zu sein betrachtet wird, was bedeutet, es immer leer sein wird. Daher funktioniert die map Funktion nicht, weil landing als ein unmöglicher Wert abgeleitet wird (es gibt keine gültigen Werte des Typs never).

Wenn Sie es beheben möchten, sollten Sie TypeScript mitteilen, welche Art von Array state wahrscheinlich ist. Die schnelle Lösung ist es eine Reihe von any zu machen:

... function landingReducer (state: any[] = [], action) ... 

Idealerweise sollten Sie speziellere Typen Ihre Parameter hinzuzufügen, so dass Typoskript Sie Fehler abfangen helfen können (wie Sie wissen, dass action eine type Eigenschaft hat?).

Hoffnung, die hilft; Viel Glück!

Verwandte Themen