2017-06-12 5 views
1

Ich bin ziemlich ein Anfänger mit der redux Muster und habe gerade begonnen, ngrx zu verwenden. Es ist großartig und es ist etwas, was ich so oft wie möglich nutzen möchte, aber ich habe ein paar Fragen bezüglich des Store Konzepts.Store vs Store <T>

Ich werde versuchen, das Problem durch ein paar Beispiele zu beschreiben und meine Frage am Ende dieses Beitrags stellen.

Beginnen wir mit den AppState Schnittstelle und Reduzierungen beginnen:

export interface AppState{ 
    people: Person[], 
    events: Event[] 
} 

//events reducer 
export function eventsReducer(state: any = {}, {type, payload}): Event[]{ 
    switch(type){ 
    case "ADD_EVENT": 
     return [...state, payload]; 
    default: 
     return state; 
    } 
} 

//people reducer 
export function peopleReducer(state: any = {}, {type, payload}): Person[]{ 
    switch(type){ 
    case "ADD_PERSON": 
     return [...state, payload]; 
    default: 
     return state; 
    } 
} 

//root reducer 
const root: ActionReducer<AppState> = combineReducers({people: peopleReducer, events: eventsReducer}); 
const INITIAL_STATE = { 
    people:[], 
    events: [] 
} 
export function rootReducer(state: any = INITIAL_STATE, action: any){ 
    return root(state, action); 
} 

rootReducer wird wie folgt hinzugefügt:

//part of the AppModule 
... 
imports:[ 
..., 
StoreModule.provideStore(rootReducer) 
] 

Und im Haupt AppComponent hier ist, wie ich accesing die store:

//part of the AppComponent 
export class AppComponent{ 
    people: Observable<Person[]>; 
    events: Observable<Event[]>; 

    constructor(private store: Store<AppState>){ 
     this.people = store.select('people'); 
     this.events = store.select('events'); 
    } 
} 

Jetzt alles funktioniert richtig und ich mag dieses Konzept wirklich, aber ich habe bemerkt, dass sich nichts ändert (oder bricht), wenn ich eine der Eigenschaften von der AppState Schnittstelle entferne (zum Beispiel entferne ich die people Eigenschaft, alles andere bleibt gleich).

Also ich würde gerne wissen, was ist der Hauptgrund dafür, dass Store<AppState> statt nur Store und was sind die wichtigsten Vorteile der Verwendung von Store<AppState> (wo es tatsächlich einen Unterschied gegen nur mit Store gemacht)? Gibt es außerdem eine Möglichkeit, mindestens Laufzeitfehler zu erzwingen, wenn sich AppState ändert, aber alles andere gleich bleibt?

Die Möglichkeit, mich falsch verwendet, ist sehr hoch, wie gut, aber ich würde immer noch Antworten gerne auf diese Fragen kennen.

Antwort

1

Die select method des Geschäfts kann eine oder mehrere Eigenschaftsstrings oder eine Auswahlfunktion übergeben werden.

Wenn Eigenschaft Strings übergeben, verhält es sich wie pluck. Und wenn eine Selektorfunktion übergeben wird, verhält es sich wie map.

Der wesentliche Unterschied zwischen ihnen ist, dass die Eigenschaft Pfad (en) zu pluck bestand nicht Typ überprüft werden kann und pluckObservable<any> kehrt, so die Typinformationen des Staates im wesentlichen verloren.

Wenn Sie Selektor-Funktionen verwenden, stattdessen werden Sie Typoskript Fehler für fehlende Eigenschaften usw.

Zum Beispiel sehen:

store.select(state => state.missing); 

wird bewirken einen Fehler, während dies nicht:

store.select('missing'); 
+0

Vielen Dank für diese Antwort. Ich habe untersucht, was es mit "T" in der "Store " Implementierung macht, aber habe nie die 'select' Methode überprüft. – eminlala