【问题标题】:Angular 2 rxjs switchmap returns Observable<Object>Angular 2 rxjs switchmap 返回 Observable<Object>
【发布时间】:2016-12-18 07:18:28
【问题描述】:

我正在构建一个 typescript angular 2 应用程序并使用 rxjs。我在这里遵循示例:

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&lt;Object&gt; to type Observable&lt;MyModel[]&gt;&gt; 一起编译

我不明白为什么 switchmap 返回 Observable 而不是我的类型。在将其提供给结果之前,我是否需要再次映射它?这是 switchmap 的返回签名的打字稿打字问题吗?

【问题讨论】:

  • 我想你只需要一个演员表。
  • 我曾尝试过,但无知地将 return 语句转换为转换所属的 switchmap 链的末尾。那是一件不容错过的蠢事。谢谢!

标签: angular typescript rxjs


【解决方案1】:

Typescript 可能有错误的类型推断,我会尝试以下方法之一:

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

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

如果这不起作用,“妥协”将结果变量的类型更改为:

 results: Observable<any>;

【讨论】:

    【解决方案2】:

    错误信息实际上是正确的。但是,在没有堆栈跟踪的情况下,不清楚是哪一行导致了错误。

    在你调用的ngOnInit()方法中:

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

    此运算符链始终返回 Observable,这与 result 属性所期望的 (Observable&lt;Array&lt;MyModel&gt;&gt;) 不同,因为 Subject 的泛型是 Search

    运算符switchmap() 始终返回Observable。它的返回类型与可调用对象无关。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-05-09
      • 2019-12-25
      • 2018-07-14
      • 2019-04-15
      • 1970-01-01
      • 1970-01-01
      • 2018-10-24
      相关资源
      最近更新 更多