RxJS emit/subscribe函数FlowJS类型检查失效问题
解决FlowJS对RxJS emit/subscribe类型检查不生效的问题
我来帮你搞定这个Flow类型检查没触发的问题~ 你遇到的核心问题是**submitEmitter.emit的参数类型没有和你定义的dataType绑定**,导致Flow没法识别出发射的payload缺了成员。下面一步步给你解决:
1. 先修正dataType的定义(小细节)
你写的精确对象类型最后多了个逗号,虽然Flow能兼容,但规范点去掉更稳妥:
type dataType = {| name: string, lastName: string, country: string, city: string, email: string, phone: string, comments: string, |};
2. 给submitEmitter的emit方法绑定严格类型
Flow不知道你的submitEmitter发射的press事件需要什么样的payload,所以得给它明确规则。先定义一个Emitter类型,限制emit的第二个参数必须是完整的dataType:
// 定义SubmitEmitter类型,指定emit的参数约束 type SubmitEmitter = { emit: (event: 'press', data: dataType) => void, }; // 然后给你的submitEmitter标注这个类型(比如在类里) class YourComponent { submitEmitter: SubmitEmitter; constructor() { // 这里根据你实际的Emitter实现初始化,比如用RxJS Subject或者自定义逻辑 this.submitEmitter = new Rx.Subject(); // 如果是自定义Emitter,确保emit方法符合上面的类型定义 } }
3. 给fromEvent显式指定泛型类型
虽然Flow有时候能自动推断,但显式指定Observable的发射类型能让检查更可靠:
Rx.Observable.fromEvent<dataType>(this.submitEmitter, 'press') .throttleTime(1000) .subscribe((data: dataType) => this.doSubmit(data));
现在测试一下!
当你移除emit payload里的任意成员(比如comments),Flow就会立刻抛出错误,提示你缺少了dataType中定义的必填字段。
为什么之前没报错?
因为之前submitEmitter的emit方法没有类型约束,Flow把它当成了可以接受任意参数的函数,自然不会检查payload的完整性。通过上面的步骤,我们把emit的参数和dataType强绑定,让Flow能准确识别不符合类型的输入。
内容的提问来源于stack exchange,提问作者arcollector
相关产品推荐
相关产品推荐

