Отсутствуют перегрузки `switchMap` и `flatMap`, содержащие 'resultSelector' в RxJS6

Я полностью запутался в новом RxJS 6 и пакете совместимости. В настоящее время у меня установлены (для Angular 6):

"rxjs": "^6.1.0",
"rxjs-compat": "^6.1.0",

Ранее я использовал эту подпись для switchMap (в RxJS5):

switchMap(
 project: function: Observable, 
 resultSelector: function(outerValue, innerValue, outerIndex, innerIndex): any): Observable

Но при обновлении до версии 6 доступна только эта перегрузка (без параметра resultSelector):

export declare function switchMap<T, R>(this: Observable<T>, 
       project: (value: T, index: number) => ObservableInput<R>): Observable<R>;

Я импортирую его с

import { switchMap } from 'rxjs/operators';

Как я могу получить доступ к этой перегрузке?

Также я попытался посмотреть \node_modules\rxjs\operators\switchMap.d.ts, чтобы увидеть, какие подписи там были, но содержимое этого файла:

 export * from 'rxjs-compat/operators/switchMap';

Итак, похоже, что основной пакет RxJS ссылается на пакет совместимости? Как это имеет смысл? Действительно ли пакет совместимости изменяет RxJS - или мой пакет был поврежден - все файлы также имеют отметки даты 1985 года!

Как я уже сказал, я очень смущен! В чем дело?


person Simon_Weaver    schedule 05.05.2018    source источник


Ответы (1)


Сигнатуры перегрузки для switchMap, включающие селектор результатов, доступны в v6 с установленным rxjs-compat или без него. Просто эти перегрузки устарели, так как они будут удалены в версии 7.

В версии 6 их еще можно использовать; устаревание - это просто предупреждение о предстоящем изменении.

От rxjs/internal/operators/switchMap.d.ts:

import { ObservableInput, OperatorFunction } from '../types';
export declare function switchMap<T, R>(project: (value: T, index: number) => ObservableInput<R>): OperatorFunction<T, R>;
/** @deprecated resultSelector is no longer supported, use inner map instead */
export declare function switchMap<T, R>(project: (value: T, index: number) => ObservableInput<R>, resultSelector: undefined): OperatorFunction<T, R>;
/** @deprecated resultSelector is no longer supported, use inner map instead */
export declare function switchMap<T, I, R>(project: (value: T, index: number) => ObservableInput<I>, resultSelector: (outerValue: T, innerValue: I, outerIndex: number, innerIndex: number) => R): OperatorFunction<T, R>;

Целью rxjs-compat является не изменение установки rxjs, а rxjs делегирование rxjs-compat функций, которые были удалены.

Например, при установке rxjs-compat импорт в стиле v5 все равно будет работать. То есть с установленным rxjs-compat все будет нормально:

import { switchMap } from 'rxjs/operators/switchMap';

Принимая во внимание, что без установленного rxjs-compat этот оператор импорта приведет к ошибке.

Дополнительные сведения см. в руководстве по миграции.

person cartant    schedule 05.05.2018
comment
Я вижу, что в руководстве по миграции написано «устарело», но его буквально нет для меня. Не будет компилироваться - если я не удалю функцию селектора результатов. (Я вижу, что они удалены для «первого», но должны оставаться для «switchMap»). Все еще пытаюсь понять, почему. - person Simon_Weaver; 05.05.2018
comment
(хотя с учетом сказанного я действительно хочу удалить весь устаревший код, так что все в порядке) - person Simon_Weaver; 05.05.2018
comment
Что-то странное должно происходить с вашей установкой или инструментами. У меня есть куча минимальных сред для проверки вещей перед публикацией ответов, и switchMap (с селектором результатов) отлично работает (при компиляции и запуске) с rxjs + rxjs-compat v6.1.0 для меня. Как с импортом в стиле v6, так и с импортом в стиле v5. - person cartant; 05.05.2018
comment
Что-то, что нужно проверить: ваши инструменты должны разрешать import { switchMap } from 'rxjs/operators'; в node_modules/rxjs/internal/operators/index через rxjs/operators/index.d.ts и т. д. Вы упомянули node_modules/rxjs/operators/switchMap.d.ts — это должно быть целью только для импорта в стиле v5, такого как import { switchMap } from 'rxjs/operators/switchMap и т. д. - person cartant; 05.05.2018