我试图理解可观察 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 extension的 OperatorFunction<X,X>
.
我的猜测是 MonoTypeOperatorFunction
界面的创建有两个目标:
- 通过定义一个显式接口(interface)来抽象前面解释的概念
- 保持
pipe(...fn: OperatorFunction<X,Y>)
的契约(Contract)通过将此接口(interface)定义为OperatorFunction
的扩展
关于typescript - RxJS6:为什么可观察的管道运算符只接收 OperatorFunction 而不是 MonoTypeOperatorFunction,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52605354/