链接可观察量时正确推断类型

时间:2016-10-25 21:00:15

标签: angular typescript rxjs

我有一个Angular2应用程序,它有一个获取项目列表的服务。还有一种方法可以为列表中的每个项目获取更多特定信息。我目前的设置是:

// service for item list
class ItemsService {
  fetchItems(): Observable<Item[]> {
    return this.http.get(url).map((res: Response) => res.json());
  }
  fetchItemsWithData(): Observable<Item[]> {
    return this.fetchItems()
    .flatMap((items: Observable<Item[]>) => items)
    .map((item: Item) => this.itemService.fetchData(item))
    .flatMap((items: Observable<Item[]>) => items)
    .toArray();
  }
}

// service for individual items
class ItemService {
  fetchData(item: Item) {
    return this.http.get(`${url}/${item.id}`)
    .map((res: Response) => res.json());
  }
}

这实际上就像我需要的那样,即使数组&lt; =&gt; observable似乎有点时髦,但它最终给了我一个包含所有项目信息的项目数组。

问题是,在return this.fetchItems()行上我总是得到:

The type argument for type parameter 'T' cannot be inferred from the usage.
Consider specifying the type arguments explicitly.
  Type argument candidate 'Item[]' is not a valid type argument because it is not a
  supertype of candidate 'Observable<Item[]>'.
    Property 'length' is missing in type 'Observable<Item[]>'.

我有点失落,因为fetchItems确实返回Observable并将其更改为Observable<any>会产生同样的错误。如果我只是将其更改为any,但我根本没有收到任何错误报告。

是否有更好的类型可用于fetchItems

3 个答案:

答案 0 :(得分:15)

当我遇到同样的问题时,原因是我忘记导入Response类:

import { Http, Response } from '@angular/http';

希望它有所帮助。

答案 1 :(得分:1)

我怀疑这可能与toArray()有关,而Observable<T[]>会返回fetchItems(): Observable<Item[]>

在您定义toArray()的情况下,它会Observable<Observable<Item[]>[]>返回Observable<any>,这就是为什么即使使用class Observable<T> { map(_): Observable<T> { return new Observable<T>() } flatMap(_): Observable<T> { return new Observable<T>() } toArray(): Observable<T[]> { return new Observable<T[]>() } } class Item { } class Response { json() { } } class HTTP { get(_) { return new Observable() } } class ItemsService { itemService = new ItemService(); http = new HTTP(); fetchItems(): Observable<Item[]> { return this.http.get('url').map((res: Response) => res.json()); } fetchItemsWithData(): Observable<Item[]> { return this.fetchItems() .flatMap((items: Observable<Item[]>) => items) .map((item: Item) => this.itemService.fetchData(item)) .flatMap((items: Observable<Item[]>) => items) .toArray(); } } // service for individual items class ItemService { http = new HTTP(); fetchData(item: Item) { return this.http.get('url') .map((res: Response) => res.json()); } } 也会引发错误的原因。

顺便说一下,我试图用模拟类来模拟你的情况,它编译时没有错误(TypeScript 2.0.3),但也许我在某个地方犯了一个错误而且它不相同(?):

git log `git describe --abbrev=0 --tags \`git describe --abbrev=0 \`^`...`git describe --abbrev=0`

答案 2 :(得分:0)

尝试将返回的类型信息添加到地图中并更改数组注释:

  1. 使用Item[]
  2. 而不是Array<Item>
  3. fetchData(item: Item): ItemData.map((item: Item): ItemData => this.itemService.fetchData(item))