typescript - 使用多个管道时 RXJS 类型推断如何工作
问题描述
const of = require('rxjs').of;
const map = require('rxjs/operators').map
of(123).pipe(
map(num => num.toString()),
map(str => str.substring(0,1)),
).subscribe(console.log);
在map
上面的第二个中,参数的类型是从返回 astr
的前一个正确推断出来的。我很好奇打字稿是如何推断第二个地图运算符中的类型的。 map
string
这个 RxJS 是不是很好地设计了代码以便它发生?
还是只是 VS 代码对 RxJS 有特殊的 IntelliSense?
解决方案
我想说这一切都由 RxJS 处理。
pipe(): Observable<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>;
...
我们可以看到发生了很多事情。
OperatorFunction<T, A>
type 指的是一个函数,它的单个参数是一个Observable类型T
,它的返回类型也是一个 Observable 类型A
:
export interface OperatorFunction<T, R> extends UnaryFunction<Observable<T>, Observable<R>> {}
我们也来看看map
的签名
export function map<T, R>(project: (value: T, index: number) => R, thisArg?: any): OperatorFunction<T, R> { ... }
如您所见,它的返回类型将是一个接收可观察对象并返回另一个可观察对象的函数。在这种情况下,返回的 Observable ( )的类型是从提供的投影函数中推断出来的:R
(value: T, index: number) => R
所以,如果你有
const src$ = of(1).pipe(map(v => '' + v));
src$
将是一个类型为 的可观察T
对象string
。
这就是为什么类型推断也适用于内部的原因subscribe
:
subscribe(next?: (value: T) => void, error?: (error: any) => void, complete?: () => void): Subscription; // Providing callbacks
subscribe(observer?: PartialObserver<T>): Subscription; // Providing an observer object
Observable 的推断类型在哪里T
(即map
在这种情况下来自 ' 提供的 fn )。
推荐阅读
- io - mmap /dev/mem 的权限被拒绝,即使使用 CAP_SYS_RAWIO,但以 root 身份工作
- c - 那个函数参数真的可以是指向常量的指针吗?
- stm32 - 为什么即使禁用时钟,D2 RAM 也能正常工作?
- javascript - Uncaught TypeError: $(...).offset() is undefined when my target is append element
- javascript - Vuex - 基于数据属性动态获取器
- python - 根据条件用不同的替换字典替换熊猫数据框列中的值
- tcl - 如何将菜单值传递给子菜单
- mpxj - MPXJ:出口到 Asta Powerproject
- angular - 继承的路由数据在 CanActivate 防护中不起作用
- javascript - 为什么最后一个容器闪烁?