[英]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)并且此功能已被弃用。
如果您不使用带有startWith
的scheduler
,那么您就可以了。
如果你这样做了,那么你需要使用scheduled
函数重写你的代码,就像他们在折旧注释旁边的评论中建议的那样: scheduled([[a, b, c], source], scheduler).pipe(concatAll())
。
很有可能,您正在使用startWith(null)
或startWith(undefined)
,尽管有通知,但它们并未被弃用,但 IDE 检测到错误的函数签名,该函数签名已被弃用,并显示警告。
或者,您正在使用formControl.valueChanges
发出any
类型,或任何其他带有any
. 因为any
与SchedulerLike
匹配,您会看到通知。
因此,请尽量避免通过添加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 将其映射到myType2
: startWith<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.