我有一个正在慢慢迁移到新ngrx
语法的大型项目。我们有许多选择器,它们是这样的普通函数:
export function appDetailsSelector(state$: Observable<AppState>): Observable<AppDetails> {
return state$.pipe(map((appState: AppState) => appState.appDetails));
}
新的选择器使用以下代码编写createSelector
:
export const selectUserConfig: MemoizedSelector<AppState, UserConfig> = createSelector(
selectUserData,
(userData: UserData) => userData.config,
);
这两个都使用相同的状态形状,但是我如何结合起来创建一个新的选择器,将这两者与createSelector
?
我知道我可以在组件代码中使用管道来执行此操作:
combineLatest([
this.store.pipe(appDetailsSelector),
this.store.select(selectUserConfig),
], (appDetails, userConfig) => ...projector fn code...);
但这不可重用,我需要完成它createSelector
以避免在多个组件中重复此操作。如果appDetailsSelector
是用它创建的,createSelector
它看起来像这样:
export const getUserBookmarks = createSelector(
appDetailsSelector,
selectUserConfig,
(appDetails: AppDetails, userConfig: UserConfig) => appDetails.useBookmarks ? userConfig.bookmarks : []
);
但是这个Argument of type 'MemoizedSelector<AppState, UserConfig, DefaultProjectorFn<UserConfig>>' is not assignable to parameter of type 'SelectorWithProps<Observable<AppState>, unknown, UserConfig>'. Types of parameters 'state' and 'state' are incompatible. Type 'Observable<AppState>' is missing the following properties from type 'AppState'...
我可以看到旧式选择器采用Observable<AppState>
而新式选择器采用AppState
;如何弥合这个差距并结合这两个选择器?