RxJS v6.3管道-如何使用?

时间:2018-09-05 16:19:17

标签: rxjs

我刚刚创建了一个新的Angular应用,该应用安装了新的RxJS v6.3(6天前发布),该应用“修复”了管道和强类型输入的问题。

使用v6.2,我只能指定管道的最终返回值(在这种情况下,为.pipe<User>,如下所示:

getStatus(): Observable<User> {
  return this.http.get('/user/status')
    .pipe<User>(
      tap(foo, bar),
      finalize(() => this.requestEnded()),
      map((resp) => new User(resp.user)));
}

但是在新版本中,他们在Observable类中消除了这种可能性(他们将这一行从v6.2.2固定为v6.3中的这一行)。 IDE抱怨此消息:

  

期望至少有0个参数,但有1个或更多。

现在我被迫为管道中的每个函数指定类型,就像这样:

getStatus(): Observable<User> {
  return this.http.get('/user/status')
    // If I have 3 piped functions I have to specify all 3 types
    .pipe<{}, {}, User>(
      tap(foo, bar),
      finalize(() => this.requestEnded()),
      // I even have to specify type for this parameter (resp)
      map((resp: {user}) => new User(resp.user))); 
}

这真的是打算吗?请注意,这是管道的“修复”,对我而言,这意味着管道始终应该像这样工作。还是我使用错误的方式?

我什至拥有一个功能很好的功能,我只是传入了一些我想针对每个请求执行的“通用管道”:

logIn(username: string, password: string, remember: boolean) {
  return this.http.post('/user/login', { username, password, remember })
    .pipe<User>(
      ...this.commonPipes(),
      map(resp => new User(resp.user)));
}

但是现在,我应该如何为此指定类型?

此更改为introduced in v6.3,它说它“修复”了管道的一些错误(它引用了this issue)。我之所以写“修复程序”,是因为它对我来说很糟糕,它不向后兼容,而且我还没有找到解释如何使用新的固定pipe()的“如何升级”指南。

1 个答案:

答案 0 :(得分:3)

问题在于,传播语法只能在其中“ pipe”的签名被“固定”的几个版本中使用。但是,这些“修补程序”实质上破坏了pipe的所有类型检查-更糟糕的是,因此它们被还原并再次更改。

this issue中所述,将扩展语法与pipe配合使用需要TypeScript 3.0-因为它支持元组参数提取和扩展。

作为让commonPipes返回一个运算符数组的替代方法,您可以考虑使用静态pipe函数将这些运算符组合为一个运算符,然后将其传递给可观察对象的{{ 1}}方法。

看看我的Combining Operators文章。