Я внедрил хранилище NgRx и обнаружил, что использую шаблон
concatMap(action => of(action).pipe(
withLatestFrom(this.store.pipe(select(fromBooks.getCollectionBookIds)))
)),
(снизу https://ngrx.io/guide/effects)
Учитывая, сколько в нем места может поднять, я хотел написать удобный оператор утилиты для его обработки.
Итак, я пришел к реализации, которая должна работать:
export function concatMapLatestFrom<A extends Action>(
...xs: Array<ObservableInput<never>>
): OperatorFunction<A, unknown> {
return function (source: Observable<A>): Observable<unknown> {
return source.pipe(
concatMap((action) => of(action).pipe(withLatestFrom(...xs))),
);
};
}
Я написал несколько правильно типизированных перегрузок:
export function concatMapLatestFrom<X1, A extends Action>(
source1: ObservableInput<X1>,
): { (source1: X1): OperatorFunction<A, [A, X1]> };
export function concatMapLatestFrom<X1, X2, A extends Action>(
source1: ObservableInput<X1>,
source2: ObservableInput<X2>,
): { (source1: X1, source2: X2): OperatorFunction<A, [A, X1, X2]> };
export function concatMapLatestFrom<X1, X2, X3, A extends Action>(
source1: ObservableInput<X1>,
source2: ObservableInput<X2>,
source3: ObservableInput<X3>,
): {
(source1: X1, source2: X2, source3: X3): OperatorFunction<
A,
[A, X1, X2, X3]
>;
};
Но по какой-то причине он считает, что сигнатура перегрузки не совместима с реализацией. Если я закомментирую один из них, он повторяется для следующего в строке.
Это ускользает от меня, что на самом деле не так с этим, и было бы неплохо, чтобы компилятор сказал мне, почему он не совместим но, к сожалению, это не дает никаких подробностей.