RxJS6: Why observable Pipe operator only receives OperatorFunction and not MonoTypeOperatorFunction

时间:2018-10-02 09:12:02

标签: typescript rxjs rxjs6

I'm trying to understand the pipe operator of observable 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>;
.......
}

As you could see, all of pipe overload methods receive and OperationFunction type.

Lets check the filter operator 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>;

As you can see, you have an overload method that returns an OperationFunction and another that returns MonoTypeOperatorFunction.

I have the following questions:

  • RxJS6 operators like filter, could only be used on pipe method?
  • Why in filter we have a overload method that return different types but the pipe only receives one?

1 个答案:

答案 0 :(得分:2)

  

RxJS6运算符(例如过滤器)只能用于管道方法吗?

管道方法是 pure high-order 函数。所以不,它们可以用作任何其他方法。区别在于,如果在pipe闭包之外调用它们,则会丢失类型为intellisense。

  

为什么在过滤器中我们有一个重载方法返回不同的类型   但是管道只收到一个?

随身携带一粒盐

流中的大多数运算符/用例都涉及转换,例如将值 x 从域 X 转换为值 y 来自域 Y OperatorFunction<X,Y>接口的定义抽象了这个概念。

对于filter运算符,我们有一个特殊的情况OperatorFunction<X,Y>,其中满足条件 X为Y而Y为X ,因为操作从域 X 中获取值 x 并将其转换为来自同一域 X 中的值 y 。这个特殊情况再次由MonoTypeOperatorFunction<X>接口抽象,该接口的确是OperatorFunction<X,X>的{​​{3}}。

我的猜测是MonoTypeOperatorFunction界面的创建有两个目标:

    通过定义显式接口
  • 抽象先前解释的概念
  • 通过将此接口定义为pipe(...fn: OperatorFunction<X,Y>)的扩展,
  • 保留 OperatorFunction的合同