Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
关于使用RxJs和typescript进行类型推断的有趣故事_Typescript_Visual Studio Code_Rxjs - Fatal编程技术网

关于使用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>;