3

我对如何分割每个减速器的各个状态有一些疑问。在很多在线教程(比如这个)中,有一个手动定义的根全局状态,它结合了所有单独的状态,称为AppState.

当我们将包含所有 reducer 的对象字面量传递给 StoreModule 时,这样说是否正确:

StoreModule.provideStore({r1: ReducerFunc1, r2: ReducerFunc2, ...})

对象键r1r2可用于在使用字符串选择器时查询状态切片:

store.select("r1")

但是,如果我们想要类型安全,我们定义 AppState 接口,并确保对象键与传递给 NgRx 的 reducer 对象字面量的对象键匹配,以便我们可以使用store.select(appstate => appstate.r1)(这是 AppState 接口唯一有用的情况)?

4

2 回答 2

4

要以这种方式设置类型安全:

export interface AppState {
     auth: AuthState;
     contacts: ContactsState;
     events: EventsState;
}

每个切片都有自己的接口。

然后你设置你的减速器

export const reducers: ActionReducerMap<AppState> = {
    auth: fromAuth.reducer;
    contacts: fromContacts.reducer;
    events: fromEvents.reducer;
}

然后在您的应用程序模块中

imports: [
    StoreModule.forRoot(reducers),
],

例如,您的 auth reducer 将像这样定义

export function reducer(state: AuthState = initialAuthState,
                        action: Action) {

等等。每个reducer 都由它的key、auth reducer 和auth state 调用。

于 2017-08-22T20:48:31.160 回答
0

我认为您必须设置 AppState 接口。例如,当您依赖注入 Store 时,您不能这样做:

constructor(private store: Store)

商店必须接受这样的界面:

constructor(private store: Store<AppState>)

鉴于您必须指定 AppState,您可能希望始终使用胖箭头函数来获取 AppState 切片,因为您可以获得类型安全。

store.select(appstate => appstate.r1)
于 2017-06-29T00:30:12.130 回答