我有一个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
?
答案 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)
尝试将返回的类型信息添加到地图中并更改数组注释:
Item[]
。Array<Item>
fetchData(item: Item): ItemData
和.map((item: Item): ItemData => this.itemService.fetchData(item))