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:
filter
, could only be used on pipe
method?pipe
only receives one?答案 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
的合同