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(。