对于Observable,Typescript被转换为void

时间:2018-03-27 18:09:42

标签: typescript

我有一个类似的课程:

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>的最佳方法是什么,以便我可以使用它?

2 个答案:

答案 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()可能是你最好的选择。