代码之家  ›  专栏  ›  技术社区  ›  Ricardo Rocha

RxJS6:为什么可观察管道操作符只接收OperatorFunction而不接收monotypeoperfunction

  •  1
  • Ricardo Rocha  · 技术社区  · 6 年前

    我在试着理解 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>;
    

    如您所见,有一个重载方法返回 另一个回来了 MonoTypeOperatorFunction .

    • RxJS6运算符 filter ,只能用于 方法?
    • 只收到一个?
    1 回复  |  直到 6 年前
        1
  •  3
  •   Jota.Toledo    6 年前

    RxJS6操作符像filter,只能用在pipe方法上?

    pure high-order 功能。所以不,它们可以作为其他方法使用。区别在于,如果你在 pipe 关闭时,您将失去类型intellisense。

    为什么在filter中我们有一个返回不同类型的重载方法 但管道只接收一个?

    把下面的东西放进盐里

    流中的大多数操作符/用例都涉及 转型 来自域 来自域 . 这个概念是由 OperatorFunction<X,Y> 接口。

    在这种情况下 filter 接线员,我们有一个专门的 ,其中 X是Y,Y是X 并将其转化为一个值 y 来自同一个域 . 这个特例再次被 MonoTypeOperatorFunction<X> defined as an extension 属于 OperatorFunction<X,X> .

    MonoTypeOperatorFunction 界面的创建有两个目标:

    • 摘要 前面通过定义显式接口解释的概念
    • 合同 pipe(...fn: OperatorFunction<X,Y>) 通过将此接口定义为 OperatorFunction
    推荐文章