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

68bkxrlz  于 2022-11-30  发布在  TypeScript
关注(0)|答案(7)|浏览(287)

自从更新到RXJS版本6以来,我的WebStorm编辑器一直在抱怨startWith()的 * 一些 * 用法,该操作符被标记为 * 弃用 *。
您可以在源代码中看到这些方法被标记为deprecated:

  • 链接到主服务器(将来更难链接)

对我来说,问题是这个警告并不一致。有时它会报告这个方法被否决了,而其他时候却没有。虽然我可以在下面的代码示例中重现这个警告。它似乎在我自己的源代码中随机发生。
未过时的:

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

标记为已过时:

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

所以我很担心这些过时的警告。过时的消息说使用scheduled()concat()操作符代替,但感觉这像是一个更复杂的替代已经方便的操作符,如startWith()
所以我有点困惑,为什么它被否决了,为什么它只是有时被否决了。

jc3wubiy

jc3wubiy1#

不,它不是。
当前只有一个活动特征码:开始于(...值)
除了这个签章之外,它还有几个接受scheduler: SchedulerLike做为最新参数的多载:startWith(...values,scheduler),此功能已过时。

如果不将schedulerstartWith一起使用,则不会有问题。

如果你这样做,那么你需要重写你的代码使用scheduled函数,就像他们建议在旁边的注解折旧注解:scheduled([[a, b, c], source], scheduler).pipe(concatAll()) .
您很可能正在使用startWith(null)startWith(undefined),尽管有此通知,但它们并未过时,但IDE检测到错误的函数签名(已过时),并显示警告。
或者,您正在使用发出any类型的formControl.valueChanges,或者任何其他带有any的可观察流。因为anySchedulerLike匹配,所以您会看到该通知。
因此,请尝试通过添加filter((v): v is number => typeof === 'number')或任何其他可能的方式来避免any

hlswsv35

hlswsv352#

如果您在使用startWith(null)时在VSCode中看到过时的警告,只需将其替换为startWith(<string>null)即可解决警告消息。
更多信息请参阅here

lmyy7pcs

lmyy7pcs3#

一种避免弃用通知的方法是对传入startWith的任何内容进行类型转换,例如OP示例中的startwith(x as boolean)
这样,您就可以确保IDE没有使用过时的签名。

iyr7buue

iyr7buue4#

当我尝试使用startWith(undefined)时,我还收到了一条已弃用的消息。原因是它的默认值为已弃用的API export declare function startWith<T>(scheduler: SchedulerLike): MonoTypeOperatorFunction<T>;
修复方法是指定返回类型D(属于未定义的):export declare function startWith<T, D>(v1: D): OperatorFunction<T, T | D>;
例如,假设我有接口MyType1,我的可观测量将其Map到myType2startWith<MyType1, MyType1>(undefined)

wgmfuz8q

wgmfuz8q5#

这一招非常管用:
startWith<void, void>(undefined);

vwkv1x7d

vwkv1x7d6#

对于一个特定的情况(文本输入元素),我目前的选择是使用一个空字符串''。它也是一个伪值。startWith('')。但是可观察的事件来自类型any。所以null也应该被接受。(背景:我使用角形材质“FormControl”值更改。)

crcmnpdw

crcmnpdw7#

已替换

startWith(null as any)

startWith<null, null>(null)

以获得更好的可读性。

相关问题