繁体   English   中英

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

[英]Is the startWith operator in RXJS really deprecated?

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

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

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

不弃用:

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

被标记为已弃用:

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

所以我很担心这些已弃用的警告。 弃用消息说要改用scheduled()concat()运算符,但这感觉就像是比startWith()这样已经很方便的运算符更复杂的替代方法。

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

不它不是。

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

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

如果您不使用带有startWithscheduler ,那么您就可以了。

如果你这样做了,那么你需要使用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其他可能的方式。

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

更多信息在这里

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

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

当我尝试startWith(undefined)时,我也收到一条已弃用的消息,原因是默认export declare function startWith<T>(scheduler: SchedulerLike): MonoTypeOperatorFunction<T>; 已弃用的 API

修复指定返回类型D (未定义的): export declare function startWith<T, D>(v1: D): OperatorFunction<T, T | D>; export declare function startWith<T, D>(v1: D): OperatorFunction<T, T | D>;

例如,假设我有接口MyType1并且我的 observable 将其映射到myType2startWith<MyType1, MyType1>(undefined)

这个技巧非常有效:

startWith<void, void>(undefined);

更换

startWith(null as any) 

startWith<null, null>(null)

为了更好的可读性。

我当前针对特定情况(文本输入元素)的替代方法是使用空字符串'' 这也是一个虚假的价值。 startWith('') 但是可观察事件来自任何类型。 所以 null 也应该接受。 (背景:我使用 Angular Material“FormControl”valueChanges。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM