0

我正在尝试创建一个界面来让自己TypeScript开心。我在做:

@Output() onChange:IMyEvent<ISliderItemData> = new Subject().delay(300).debounceTime(1000) ;// emits ISliderItemData

但我收到以下错误:

Error:(68, 5) TS2322:Type 'Observable<{}>' is not assignable to type 'IMyEvent<ISliderItemData>'.
  Property '__isAsync' is missing in type 'Observable<{}>'.

我试图用下面的代码来满足 TS 但它不起作用:

class IMyEvent<T> extends Subject<T> {
    __isAsync: boolean;
}

有任何想法吗?

4

3 回答 3

1

我没有对其进行测试,但我想以下可能会起作用:

@Output() onChange:IMyEvent<ISliderItemData> = <IMyEvent<ISliderItemData>>(new Subject().delay(300).debounceTime(1000)) ;

为什么不定义跟随?

class IMyEvent<T> extends Observable<T> {
    __isAsync: boolean;
}

然后使用: @Output() onChange:IMyEvent<ISliderItemData> = new IMyEvent<ISliderItemData>().delay(300).debounceTime(1000) ;

这将创建类型化的主题(并通过 delay() 和 debounceTime() 转换为 Observable)

编辑: 我已将原始答案更改SubjectIMyEvent. 最重要的是 - 如果我看到代码和注释 - 我相信保持清洁Subject以便能够根据next()需要调用和使用delay()以及debounceTime()在消费方面会更好。

于 2017-03-21T22:39:26.363 回答
0

因此,正如@jonrsharpe 所说,您可以在推送方面执行此操作,但如果您想在声明时执行此操作,这将起作用:

@Output() onChange:Observable<ISliderItemData> = new Subject().delay(300).debounceTime(1000);

...

然后:

 (this.onChange as Subject<ISliderItemData>).next({data})
于 2017-03-21T22:47:01.767 回答
0

正如你所指出的,

@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 变量上是个人偏好 - 编译器不需要它,但对于增加一些代码清晰度很有用。

于 2017-03-22T00:45:59.847 回答