当使用多管道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中,str参数的类型是从返回string的前一个map中正确推断的。我很好奇typescript是如何在第二个map操作符中推断类型的。

这是RxJS精心设计的代码吗
或者只是VS代码对RxJS有特殊的IntelliSense?

我认为这一切都由RxJS处理。

pipe过载

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>类型是指一个函数,其单个参数是T类型的Observable,其返回类型也是A:类型的Observable

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));

CCD_ 12将是其类型CCD_ 13将是CCD_。

这就是为什么类型推理也在subscribe:中起作用

subscribe(next?: (value: T) => void, error?: (error: any) => void, complete?: () => void): Subscription; // Providing callbacks
subscribe(observer?: PartialObserver<T>): Subscription; // Providing an observer object

其中T是推断出的Observable的类型(即在这种情况下根据map提供的fn(。

相关内容

  • 没有找到相关文章

最新更新