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

前端之家收集整理的这篇文章主要介绍了angular – 链接可观察量时正确推断类型前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个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());
  }
}

这实际上就像我需要的那样,即使数组< => observable似乎有点时髦,但它最终给了我一个包含所有项目信息的项目数组的可观察性.

问题是,在返回this.fetchItems()行时我总是得到:

06001

我有点不知所措,因为fetchItems确实返回一个Observable并将其更改为Observable< any>给出了同样的错误.如果我只是将其更改为任何,但我根本没有得到任何错误报告.

有没有更好的类型用于fetchItems?

我怀疑这可能与toArray()有关,它返回Observable< T []>.

在您定义fetchItems()的情况下:Observable< Item []>它使toArray()返回Observable< Observable< Item []> []>这就是为什么即使使用Observable< any>它也会抛出错误.

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

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());
    }
}

猜你在找的Angularjs相关文章