2017-06-12 11 views
1

私はかなり初心者で、reduxパターンで、ngrxを使い始めました。素晴らしいですが、できるだけ多く使用したいものですが、Storeのコンセプトに関するいくつかの質問があります。Store vs Store <T>

私はいくつかのサンプルを通してこの問題を説明し、このポストの最後に質問します。

AppStateインタフェースと減速で始まるのをしてみましょう:

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は、次のように追加されます:

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

そして、ここでの主なAppComponentには、私はstoreをaccesingてる方法です:

//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'); 
    } 
} 

今、すべてこのコンセプトは本当に好きですが、AppStateインターフェイスからプロパティの1つを削除すると(たとえば、peopleのプロパティを削除しても、それ以外のものはすべて同じままです)、何も変わらない(または中断する)ことに気付きました。

だから私はStore<AppState>を持つだけではなくStoreと(それが実際にはStoreを使っに対する違いを作られているところ)Store<AppState>を使用する主な利点は何のための主な理由が何であるかを知っていただきたいと思いますか?また、AppStateが変更されたときに少なくともランタイムエラーを強制する方法はありますか?それ以外はすべて同じままですか?

私が間違って使っている可能性も非常に高いですが、私はまだこれらの質問に対する回答を知りたいと思います。

答えて

1

ストアのselect methodには、1つ以上のプロパティ文字列またはセレクタ関数を渡すことができます。

プロパティ文字列を渡すと、pluckのように動作します。セレクタ関数が渡されると、mapのように動作します。

これらの間に有意な差は、プロパティパス(複数可)のタイプを確認することができないpluckpluck戻るObservable<any>に渡され、そう状態の型情報が本質的に失われることです。

あなたはセレクター機能を使用する場合は、代わりに、あなたがプロパティを欠落しているために活字のエラーが表示されます、など

たとえば、この:これはしません一方

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

は、エラーに影響を与えます。

store.select('missing'); 
+0

この回答に感謝します。私は、 'Store '実装で 'T 'を使って何をしているのか調べてきましたが、決して' select'メソッドを確認することには悩まされませんでした。 – eminlala