【发布时间】:2020-12-08 05:07:00
【问题描述】:
我有以下类的一个实例:
// Interface from library
interface EventEmitter {
on(eventName: 'click', handler: () => void): void
on(eventName: 'change', handler: (newVal: string) => void): void
// much more events
}
我想以通用方式将此事件订阅转换为 rxjs 可观察对象:
class EventHolder {
click$ = this.fromEvent('click')
change$ = this.fromEvent('change')
private emitter
constructor(instance: EventEmitter) {
this.emitter = instance
}
// here we lose the type
private fromEvent<E, T>(eventName: E): Observable<T> {
// No overload matches this call.
return new Observable<T>(o => this.emitter.on(eventName, o.next))
}
}
但这不起作用,因为 typescript 无法推断 E 的类型。
有没有一种很好的方法来编写这个fromEvent 函数并保持类型安全?
目前我执行以下操作:
class EventHolder {
click$ = this.fromClickEvent()
change$ = this.fromChangeEvent()
private emitter
constructor(instance: EventEmitter) {
this.emitter = instance
}
private fromClickEvent(): Observable<void> {
return new Observable<void>(o => this.emitter.on('click', o.next))
}
private fromChangeEvent(): Observable<string> {
return new Observable<string>(o => this.emitter.on('change', o.next))
}
}
有没有更好的方法,重复代码更少?
【问题讨论】:
标签: typescript rxjs