【问题标题】:RxJS v6.3 pipe - How to use it?RxJS v6.3 管道 - 如何使用它?
【发布时间】:2019-02-10 20:46:02
【问题描述】:

我刚刚创建了一个新的 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() 的“如何升级”指南。

【问题讨论】:

  • 看看回购中的 PR diff 和其他测试 - github.com/reactivex/rxjs/commit/872b0ec
  • 哇,我刚刚注意到这个问题只有在我做.pipe(...this.commonPipes()) 的奇怪事情时才会出现。对于我这个愚蠢的错误,这个问题太大太傻了。

标签: rxjs


【解决方案1】:

问题在于扩展语法只能在pipe 的签名被“固定”的几个版本中使用。然而,这些“修复”基本上破坏了pipe 的所有类型检查——情况更糟,因此它们被还原并再次更改。

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

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

看看我的Combining Operators 文章。

【讨论】:

  • 这是我所期待的答案。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-09-13
  • 2020-03-26
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
  • 2020-06-18
相关资源
最近更新 更多