typescript - RxJS6:为什么可观察的管道运算符只接收 OperatorFunction 而不是 MonoTypeOperatorFunction

标签 typescript rxjs rxjs6

我试图理解可观察 API 的 pipe 运算符:

 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 只接收一个?

最佳答案

RxJS6 operators like filter, could only be used on pipe method?

管道方法是 pure high-order 功能。所以不,它们可以用作任何其他方法。不同之处在于,如果您在 pipe 之外调用它们闭包,你将失去类型智能感知。

Why in filter we have a overload method that return different types but the pipe only receives one?

对以下内容持保留态度

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

filter 的情况下运算符,我们有一个特例 OperatorFunction<X,Y> ,其中满足条件 X 是 Y 且 Y 是 X,因为该操作从域 X 中获取值 x 并将其转换转换成来自同一域 X 的值 y。这个特例再次被 MonoTypeOperatorFunction<X> 抽象出来界面,这确实是defined as an extensionOperatorFunction<X,X> .

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

  • 通过定义一个显式接口(interface)来抽象前面解释的概念
  • 保持pipe(...fn: OperatorFunction<X,Y>)的契约(Contract)通过将此接口(interface)定义为 OperatorFunction 的扩展

关于typescript - RxJS6:为什么可观察的管道运算符只接收 OperatorFunction 而不是 MonoTypeOperatorFunction,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52605354/

相关文章:

Angular7 放置区 : click event not triggered

angular - 尝试在我当前的 Angular 应用程序中使用异步管道而不是订阅

angular - 我如何使用 catchError() 并仍然返回带有 rxJs 6.0 的类型化 Observable?

angular6 - 如何将可观察量转换为另一个可观察量

javascript - RxJS如何实现flatMapLatest 二

angular - RxJS - 告诉 observable 等待其他 observable 发出非空值

typescript - 为什么导入节点模块会破坏我在 atom-typescript 中的内部 Typescript namespace ?

取消窗口打印时的 Angular 6 typescript 监听事件(单击取消打印)

typescript - 我如何丑化我的 AngularJS 2 Typescript 应用程序文件并使用 Gulp 连接到生产版本

javascript - 在 RxJS 中,Observer 是否被注入(inject)到 Observable 执行中?