RxJS6: Почему наблюдаемый оператор Pipe получает только OperatorFunction, а не MonoTypeOperatorFunction - PullRequest
0 голосов
/ 02 октября 2018

Я пытаюсь понять оператор pipe наблюдаемого API:

 export declare class Observable<T> implements Subscribable<T> {
.......
    pipe<A>(op1: OperatorFunction<T, A>): Observable<A>;
    pipe<A, B>(op1: OperatorFunction<T, A>, op2: OperatorFunction<A, B>): Observable<B>;
    pipe<A, B, C>(op1: OperatorFunction<T, A>, op2: OperatorFunction<A, B>, op3: OperatorFunction<B, C>): Observable<C>;
    pipe<A, B, C, D>(op1: OperatorFunction<T, A>, op2: OperatorFunction<A, B>, op3: OperatorFunction<B, C>, op4: OperatorFunction<C, D>): Observable<D>;
    pipe<A, B, C, D, E>(op1: OperatorFunction<T, A>, op2: OperatorFunction<A, B>, op3: OperatorFunction<B, C>, op4: OperatorFunction<C, D>, op5: OperatorFunction<D, E>): Observable<E>;
    pipe<A, B, C, D, E, F>(op1: OperatorFunction<T, A>, op2: OperatorFunction<A, B>, op3: OperatorFunction<B, C>, op4: OperatorFunction<C, D>, op5: OperatorFunction<D, E>, op6: OperatorFunction<E, F>): Observable<F>;
    pipe<A, B, C, D, E, F, G>(op1: OperatorFunction<T, A>, op2: OperatorFunction<A, B>, op3: OperatorFunction<B, C>, op4: OperatorFunction<C, D>, op5: OperatorFunction<D, E>, op6: OperatorFunction<E, F>, op7: OperatorFunction<F, G>): Observable<G>;
    pipe<A, B, C, D, E, F, G, H>(op1: OperatorFunction<T, A>, op2: OperatorFunction<A, B>, op3: OperatorFunction<B, C>, op4: OperatorFunction<C, D>, op5: OperatorFunction<D, E>, op6: OperatorFunction<E, F>, op7: OperatorFunction<F, G>, op8: OperatorFunction<G, H>): Observable<H>;
    pipe<A, B, C, D, E, F, G, H, I>(op1: OperatorFunction<T, A>, op2: OperatorFunction<A, B>, op3: OperatorFunction<B, C>, op4: OperatorFunction<C, D>, op5: OperatorFunction<D, E>, op6: OperatorFunction<E, F>, op7: OperatorFunction<F, G>, op8: OperatorFunction<G, H>, op9: OperatorFunction<H, I>): Observable<I>;
.......
}

Как вы можете видеть, все методы перегрузки канала получают и имеют тип OperationFunction.

Давайте проверим API оператора фильтра:

export declare function filter<T, S extends T>(predicate: (value: T, index: number) => value is S, thisArg?: any): OperatorFunction<T, S>;
export declare function filter<T>(predicate: (value: T, index: number) => boolean, thisArg?: any): MonoTypeOperatorFunction<T>;

Как видите, у вас есть метод перегрузки, который возвращает OperationFunction, а другой - MonoTypeOperatorFunction.

. У меня есть следующеевопросы:

  • Операторы RxJS6, такие как filter, могут использоваться только для метода pipe?
  • Почему в фильтре у нас есть метод перегрузки, который возвращает разные типы, но pipe получает только один?

1 Ответ

0 голосов
/ 02 октября 2018

Операторы RxJS6, такие как фильтр, могут использоваться только для метода канала?

Методы канала - это чисто старшие функции .Так что нет, их можно использовать как любой другой метод.Разница в том, что если вы вызываете их за пределами pipe замыкания, вы потеряете тип intellisense.

Почему в фильтре у нас есть метод перегрузки, который возвращает разные типы, но канал получает только один?

Возьмем следующее с частичкой соли

Большинство операторов / сценариев использования в потоках включают преобразование , например преобразованиезначение x из домена X до значения y из домена Y .Эта концепция абстрагируется от определения интерфейса OperatorFunction<X,Y>.

В случае оператора filter мы имеем специальный случай OperatorFunction<X,Y>, в котором условие X равно Yи Y - X выполняется, поскольку операция принимает значение x из домена X и преобразует его в значение y из того же домена X .Этот особый случай снова абстрагируется от интерфейса MonoTypeOperatorFunction<X>, который действительно определен как расширение OperatorFunction<X,X>.

Я предполагаю, что интерфейс MonoTypeOperatorFunction был создан с2 цели:

  • Аннотация ранее объясненная концепция путем определения явного интерфейса
  • Сохранить контракт pipe(...fn: OperatorFunction<X,Y>) путем определения этогоинтерфейс как расширение OperatorFunction
...