RXJS 中的 startWith 运算符真的被弃用了吗?

Rea*_*lar 38 javascript rxjs typescript

自从更新到 RXJS 版本 6 以来,我的 WebStorm 编辑器一直在抱怨startWith() 的某些用法,即运算符被标记为deprecated

您可以在源代码中看到这些方法被标记为已弃用:

对我来说的问题是弃用的警告不一致。有时它会报告不推荐使用的方法,有时则不会。虽然我可以在下面的代码示例中重现警告。它似乎随机发生在我自己的源代码中。

不弃用:

  of(false).pipe(startWith(true));
Run Code Online (Sandbox Code Playgroud)

被标记为弃用:

  const x: any = true;
  of(false).pipe(startWith(x));
Run Code Online (Sandbox Code Playgroud)

所以我担心这些已弃用的警告。弃用消息说要使用scheduled()andconcat()运算符,但这感觉像是startWith().

所以我有点困惑为什么它被弃用,但为什么它有时只被弃用。

sat*_*ime 40

不它不是。

目前只有一个活动签名:startWith(...values)

除了这个签名之外,它还有几个重载可以scheduler: SchedulerLike作为最新的参数:startWith(...values, scheduler)并且这个功能已经被弃用了。

如果你不schedulerstartWith你一起使用就好了。

如果你这样做,那么你就需要使用重写代码scheduled的功能,就像他们在折旧注释旁的意见建议:scheduled([[a, b, c], source], scheduler).pipe(concatAll())


很有可能,您正在使用startWith(null)or startWith(undefined),尽管有通知,但它们并未被弃用,但 IDE 检测到错误的函数签名,该签名已被弃用,并显示警告。

或者,您正在使用formControl.valueChangeswhich 发出any类型,或任何其他带有any. 因为any匹配SchedulerLike,所以你会看到通知。

因此,尽量避免any通过添加filter((v): v is number => typeof === 'number')或任何其他可能的方式。

  • 对于其他在使用“null”作为起始值时发现此问题的人,打字稿编译器认为您可能正在使用重载“startWith<T>(scheduler: SchedulerLike)”,这就是出现警告的原因。 (11认同)
  • 如果您因使用 startWith(null) 或 startWith(undefined) 而收到警告,则该警告是错误的,可能会被忽略。但是您可以通过将 null 或 undefined 转换为某种类型来修复它。它可能是相关 Observable 的某种类型,或者只是一些不相关的类型,例如 startWith(<string>null)。编辑:实际上 Anh-Thi DINH 已经[在下面发布了](/sf/answers/4688008111/)。 (4认同)
  • 我发现使用 startWith(null) 时出现错误,在这种情况下我应该删除 startWith 吗? (2认同)

Anh*_*INH 20

对于在使用 时在 VSCode 中看到已弃用警告的用户startWith(null),只需将其替换为startWith(<string>null)即可解决警告消息。

更多信息请参见此处


Syg*_*ral 5

避免弃用通知的一种方法是对您传入的任何内容进行类型转换startWith。例如startwith(x as boolean)在 OP 的示例中。

这样,您就可以向 IDE 保证您没有使用已弃用的签名。