2016-08-11 89 views
4

我正在构建打字稿角度2应用程序并使用rxjs。我在这里继例如:Angular 2 rxjs switchmap returns Observable <Object>

https://angular.io/docs/ts/latest/tutorial/toh-pt6.html#!#stq=formgroup&stp=1

全部虽然我试图以打字稿强类型我返回签名。这可能是我的问题,因为你不应该这样做。但似乎你应该能够。

假设我有键入的服务返回一个Observable>。

public search(term: string) : Observable<Array<MyModel>> { // http call } 

在我的组件中,我试图听这个可观察的流并返回结果。

private search = new Subject<Search>(); 
results: Observable<Array<MyModel>>; 

ngOnInit() { 
    this.results = this.search 
     .debounceTime(400) 
     .distinctUntilChanged() 
     .switchMap(search => { 
      return service.search(search.term); // returns Observable<Array<MyModel>> 
     }); 
    } 

这并不与消息Cannot convert type Observable<Object> to type Observable<MyModel[]>>

我不明白为什么switchmap正在恢复,而不是我喜欢的类型可观察到的编译。在给出结果之前,我是否需要重新映射它?这是与switchmap的返回签名的打字稿类型问题?

+2

我认为你需要的只是一个演员。 – Andrew

+0

我曾尝试过,但无意中铸造了返回语句,而不是在属于演员的switchmap链的末尾。这是一个头脑不清的问题。谢谢! – twifosp

回答

1

打字稿可能有错误的类型推断,我会尝试以下操作之一:

给你的处理程序返回类型:

.switchMap((search): Observable<Array<MyModel>> => { 
     return service.search(search.term); // returns Observable<Array<MyModel>> 
    }); 

,如果这也不行,“妥协”改变结果变量的类型为:

results: Observable<any>; 
0

错误消息其实是对的。但是,如果没有堆栈跟踪,哪条线路导致错误还不清楚。

ngOnInit()方法调用:

this.results = this.search 
    .debounceTime(..) 
    ... 

运营商这条链总是返回Observable这是不一样的result属性需要(Observable<Array<MyModel>>),因为Subject的一般是Search

运营商switchmap()总是返回Observable。它的返回类型与可调用函数无关。

您应该能够通过简单的类型转换的结果来解决这个问题:

this.results = Observable<MyModel[]>this.search 
    .debounceTime(..) 
    ...