RXJS中的startWith操作符真的已经被弃用了吗?

62

自从升级到 RXJS 6 版本后,我的 WebStorm 编辑器在某些使用 startWith() 运算符的情况下会给出已弃用警告。

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

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

未弃用:

  of(false).pipe(startWith(true));

已被标记为过时:

  const x: any = true;
  of(false).pipe(startWith(x));

所以我担心这些已过时的警告。虽然过时的消息建议使用scheduled()concat()运算符,但那似乎是对于已经很方便的startWith() 运算符而言更复杂的替代方法。

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


9
不行。https://github.com/ReactiveX/rxjs/issues/4772 - cartant
@cartant 哦,我现在明白了。如果你想的话,那应该就是答案。 - Reactgular
2
时间紧迫。如果您能自己回答问题,我会很感激。我已将改进弃用消息添加到我的TODO列表中。还有这个问题:https://github.com/ReactiveX/rxjs/issues/4776 - cartant
@cartant 没问题。感谢你对 RxJS 所做的出色工作。 - Reactgular
7个回答

72
不,不是被废弃。目前只有一个活跃的签名:startWith(...values)
除了这个签名之外,它还有几个重载函数,接受 scheduler: SchedulerLike 作为最后一个参数:startWith(...values, scheduler),而这个功能已经被弃用。 如果你在使用 startWith 的时候没有使用 scheduler,那么就没有问题。 但如果你使用了,那么你需要使用注释旁边推荐的 scheduled 函数重写代码,如下所示:scheduled([[a, b, c], source], scheduler).pipe(concatAll())
很可能,你正在使用 startWith(null)startWith(undefined),尽管有提示,但它们并没有被弃用,应该是 IDE 检测到错误的函数签名,并显示警告。
或者,你正在使用 formControl.valueChanges,它会发出 any 类型,或者其他任何带有 any 的可观察流。因为 anySchedulerLike 匹配,所以你会看到这个提示。因此,尝试避免通过添加 filter((v): v is number => typeof === 'number') 或任何其他可能的方式使用 any

14
对于其他人在使用null作为起始值时,TypeScript编译器认为您可能正在使用重载startWith<T>(scheduler: SchedulerLike),因此会出现警告。为使内容更加通俗易懂,翻译如下:如果您在使用null作为起始值时出现警告,这是因为TypeScript编译器认为您可能正在使用startWith<T>(scheduler: SchedulerLike)这个函数重载。 - ntziolis
3
我发现使用 startWith(null) 会出错,那我在这种情况下应该删除 startWith 吗? - BruneX
4
如果您由于使用startWith(null)或startWith(undefined)而收到警告,则此警告是错误的,可以忽略。但您可以通过将null或undefined转换为某种类型来解决此问题。它可以是相关Observable的某种类型,也可以是一些不相关的类型,例如startWith(<string>null)。 - Alex Che

20

如果在使用startWith(null)时,在VSCode中看到了“已弃用”的警告,请将其替换为startWith(<string>null),以解决警告消息。

更多信息请参见此处


9
避免弃用通知的一种方法是将要传递给 startWith 的任何内容进行类型转换,例如,在 OP 示例中使用 startwith(x as boolean).

这样做可以向IDE确保您没有使用已被弃用的签名。


2
当我尝试使用startWith(undefined)时,我也收到了一个已弃用的消息。原因是它默认为export declare function startWith<T>(scheduler: SchedulerLike): MonoTypeOperatorFunction<T>;这个已弃用的API。
解决方法是指定返回类型D(undefined的类型): export declare function startWith<T, D>(v1: D): OperatorFunction<T, T | D>; 例如,假设我有接口MyType1,我的可观察对象将其映射到myType2: startWith<MyType1, MyType1>(undefined)

1
这个技巧非常有效:
开始使用 startWith<void, void>(undefined);

使用上述方法时出现以下错误: 类型“OperatorFunction<void,void>”的参数无法分配给类型“OperatorFunction<Object,void>”的参数。 类型“void”无法分配给类型“Object”。 - Siddharth Sharma

0

对于特定情况(文本输入元素),我目前的替代方案是使用空字符串''。它也是一个假值。startWith('')。但可观察事件是任意类型的。因此,null 也应该被接受。(背景:我使用 Angular Material 的“FormControl”valueChanges。)


-1

已替换

startWith(null as any) 

使用

startWith<null, null>(null)

为了更好的可读性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接