我有一个类似的课程:
class Consumer {
consume(event: Observable<void>) {
event.subscribe(() => console.log('Something happened'));
}
}
我的观察源不是无效的:
const obs = Observable.interval(1000);
我可以用来消耗观察力的两个笨拙的解决方案是:
// Bad (wasteful call to map)
consumer.consume(obs.map(() => {}));
// Bad (confusing syntax)
consumer.consume(obs as any as Observable<void>);
将我的observable投射到Observable<void>
的最佳方法是什么,以便我可以使用它?
答案 0 :(得分:2)
函数上的泛型类型很好地解决了这种情况:
class Consumer {
consume<X>(event: Observable<X>) {
event.subscribe(() => console.log('Something happened'));
}
}
请注意,使用Observable<any>
的直接“修复”会牺牲类型安全性。例如,它允许实施
consume(event: Observable<any>) {
event.subscribe((value) => value.literallyAnyMethod());
}
...没有任何编译器错误。这种情况(以及许多类似的情况)促使许多代码库实现了禁止any
的规则。
我不认为TypeScript具有单一的非泛型类型,它允许您安全地实施,但不允许我的不安全实施,因此泛型X(尽管未使用)是正确的解决方案。
答案 1 :(得分:0)
听起来你想要的不是VisualBrush.Visual
,而是Observable<void>
。这将允许您将任何可观察量传递到Observable<any>
。如果你真的必须投,那么consume()
可能是你最好的选择。