关于使用RxJs和typescript进行类型推断的有趣故事
我有以下代码关于使用RxJs和typescript进行类型推断的有趣故事,typescript,visual-studio-code,rxjs,Typescript,Visual Studio Code,Rxjs,我有以下代码 let obs$: Observable<string> obs$.pipe( tap(data => { // do stuff }), ); 现在,如果我将鼠标悬停在data上,类型推断告诉我data属于any类型 这似乎是一个追溯性的推论。这种推理行为背后的原因是什么 这里有一个例子来重现这种情况 由@Andrei Gătej的回复提供的答案 整个谜团在于ignoreElements
let obs$: Observable<string>
obs$.pipe(
tap(data => {
// do stuff
}),
);
现在,如果我将鼠标悬停在data
上,类型推断告诉我data
属于any
类型
这似乎是一个追溯性的推论。这种推理行为背后的原因是什么
这里有一个例子来重现这种情况
由@Andrei Gătej的回复提供的答案
整个谜团在于ignoreElements()
的声明方式,即
export declare function ignoreElements(): OperatorFunction<any, never>;
基本上,在pipe()
中有这样一条链
MonoTypeOperatorFunction<T>,
OperatorFunction<any, never>
如果您这样做,变量data
将被推断为string
类型,这正是我们想要的
一个更优雅的解决方案是更改ignoreElements()
的声明。如果你这样申报的话
export declare function tap<T>(observer: PartialObserver<T>): MonoTypeOperatorFunction<T>;
obs$.pipe(
tap(data => {
// do stuff
}),
)
.pipe(
ignoreElements()
);
export declare function ignoreElements<T>(): OperatorFunction<T, never>;
导出声明函数ignoreElements():运算符函数;
一切都按预期进行,无需任何技巧
建议更改
ignoreElements()
的声明可能是值得的。这是一个非常有趣的问题
让我们看看ignoreElements()
的类型:
导出函数ignoreElements():运算符函数
这里需要注意的最重要的事情是OperatorFunction
,其定义如下:
export-interface-UnaryFunction{(源代码:T):R;}
导出接口运算符函数扩展了一元函数{}
因此,UnaryFunction
描述了一个函数,它接收T
类型的参数,并返回R
类型的内容
类似地,OperatorFunction
是一个函数,它接受类型为T
的可观察的
参数,并返回类型为R
的可观察的
返回到ignoreElements()
的类型:OperatorFunction
每个运算符都返回一个OperationFunction
。例如,从
pipe.我用你的答案更新了我的问题。谢谢
export declare function ignoreElements<T>(): OperatorFunction<T, never>;