angular – 链接可观察量时正确推断类型
发布时间:2020-12-17 07:20:22 所属栏目:安全 来源:网络整理
导读:我有一个Angular2应用程序,它有一个获取项目列表的服务.有一种方法可以为列表中的每个项目获取更多特定信息.我目前的设置是: // service for item listclass ItemsService { fetchItems(): ObservableItem[] { return this.http.get(url).map((res: Respons
我有一个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()行时我总是得到:
我有点不知所措,因为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()); } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |