正如你所指出的,
@Output() onChange:IMyEvent<ISliderItemData> = new Subject().delay(300).debounceTime(1000) ;// emits ISliderItemData
您正在获取一个主题,然后在其上调用延迟运算符。那时,你不再有一个 Subject - 你有一个 Observable。任何其他链接到它的运算符也将返回 Observables。因此,你的表达式的结果(即'='右边的东西)是一个Observable。因此,Typescript 期望您对权利的声明是匹配类型,即 Observable。
因此,最简单的形式是:
@Output() onChange: Observable = new Subject().delay(300).debounceTime(1000) ;// emits ISliderItemData
但是,在您的情况下,您希望键入 onChange 变量来指示 Observable 发出的类型。您还应该键入您的主题以使其匹配。所以,这就变成了:
@Output() onChange: Observable<ISliderItemData> = new Subject<ISliderItemData>().delay(300).debounceTime(1000) ;// emits ISliderItemData
现实情况是,Typescript 非常聪明地根据使用情况推断类型,因此您实际上可以使用:
@Output() onChange = new Subject<ISliderItemData>().delay(300).debounceTime(1000) ;// emits ISliderItemData
Typescript 编译器将看到延迟运算符(以及产生的 debounceTime 运算符)的返回类型是 Observable 并自动将该类型分配给您的 onChange 实例变量。
在这种情况下,您是否费心将类型放在 onChange 变量上是个人偏好 - 编译器不需要它,但对于增加一些代码清晰度很有用。