2017-03-05 129 views
0

有了这个代码类型'{count:number; }“是不能分配给类型的参数”数

const start$ = Observable.fromEvent(this.getNativeElement(this.start),'click'); 
    const stop$ = Observable.fromEvent(this.getNativeElement(this.stop),'click'); 
    const interval$ = Observable.interval(1000); 
    const data = {count:0}; 

    const intervalThatStops$ = interval$ 
    .takeUntil(stop$); 

start$ 
    .switchMapTo(intervalThatStops$) 
    .startWith(data) 
    .scan((acc,curr) => { 
     return { 
     count: acc.count+1 
     }; 
    }) 
    .subscribe((x)=> console.log(x.count)); 

我在控制台得到

类型“{算的参数:数; }'不能分配给类型为'number |的参数IScheduler”。 键入'{count:number; }'不能分配给'IScheduler'类型。 属性'now'在类型'{count:number; }”)。

速战速决应该

.startWith<any>(data) 

但什么是正确的做法吗?

在此先感谢

回答

2

从intervalThatStops $以它的零件,

start$ 
    .switchMapTo(intervalThatStops$) 
    .startWith(data) 

是switchMapTo后,你得到的可观察会发出值。并且intervalThatStops $发出纯数字。因此,当您尝试.startWith({count:0})时,您会看到Typescript错误,因为您的observable正在发出数字,但您正试图用一个对象({count:0})开始。

解决的办法是在使用startWith之前将intervalThatStops $映射到对象。

你可以这样做多种方式 - 一种可能性是:使用地图,你可以避开.startWith(数据),它似乎并没有解决办法很干净所有的一切我想

start$ 
    .switchMapTo(intervalThatStops$) 
    .map(i => ({count: i}))) 
    .startWith(data) 
+0

感谢您的答复我的startWith – Whisher

+0

好吧,来自区间运算符的第一个发射是0,如你所说,你并不需要'startWith' – snorkpete

相关问题