在选择器中使用max



我想写一个选择器,得到所有的问题,得到的对象有最大的订单,并返回这个订单(这是一个数字)。所以我的想法是:我必须选择我所有的问题,得到最大的顺序,并映射这个顺序。但我不知道。

选择器:

export const selectQuestions = (state: AppState) => state.questions;

我想写的选择器:

export const getLastOrderIndex = createSelector(
select(selectQuestions), 
max<Question>((a: Question, b: Question) => a.order < b.order ? -1 : 1),
map(x => x.order)
)

日志错误(visual studio代码给我):

No overload matches this call.
Overload 1 of 32, '(s1: Selector<Observable<AppState>, Observable<Question>>, s2: Selector<Observable<AppState>, Observable<any>>, projector: (s1: Observable<...>, s2: Observable<...>) => Observable<...>): MemoizedSelector<...>', gave the following error.
Argument of type '(source$: Observable<AppState>) => Observable<QuestionState>' is not assignable to parameter of type 'Selector<Observable<AppState>, Observable<Question>>'.
Type 'Observable<QuestionState>' is not assignable to type 'Observable<Question>'.
Type 'QuestionState' is missing the following properties from type 'Question': id, type, sectionName, order, and 4 more.
Overload 2 of 32, '(s1: SelectorWithProps<Observable<AppState>, unknown, Observable<Question>>, s2: SelectorWithProps<Observable<AppState>, unknown, Observable<...>>, projector: (s1: Observable<...>, s2: Observable<...>, props: unknown) => Observable<...>): MemoizedSelectorWithProps<...>', gave the following error.
Argument of type '(source$: Observable<AppState>) => Observable<QuestionState>' is not assignable to parameter of type 'SelectorWithProps<Observable<AppState>, unknown, Observable<Question>>'.
Type 'Observable<QuestionState>' is not assignable to type 'Observable<Question>'

我知道有什么地方很不对劲,但我不知道在哪里。有人能解释一下吗?我读了所有的文档,但我知道我遗漏了一些东西。

我认为你正在错误地创建你的选择器。你试图在没有可观察对象的地方使用RxJS操作符。

相反,您可以使用reduce来查找最大值:

export const selectQuestions = (state: AppState) => state.questions;
export const selectMaxOrder = createSelector(
selectQuestions,
(questions: Array<Question>) => questions
.reduce(
(max, cur) => cur.order > max ? cur.order : max,
0
)
);
然后在你的组件/facade中,你可以使用选择器:
maxOrder$ = this.store.pipe(select(selectMaxOrder));

最新更新