Mam aplikację Angular2, która ma usługę, która pobiera listę elementów. Istnieje również metoda pobierania bardziej szczegółowych informacji dla każdego elementu na liście. Moja obecna konfiguracja jest:Prawidłowe wnioskowanie typów podczas łączenia obserwatorów
// 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());
}
}
To faktycznie działa dokładnie tak, jak trzeba go chociaż tablica < => obserwowalne wydaje się trochę funky, ale kończy się dając mi zaobserwować tablicy elementów ze wszystkimi informacji o pozycji.
Problem polega na linii return this.fetchItems()
zawsze dotrzesz:
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[]>'.
jestem na kawałku straty od fetchItems
nie zwróci Observable
i zmieniając go do Observable<any>
daje takie same błąd. Jeśli po prostu zmienię go na any
, ale nie otrzymuję żadnych raportów o błędach.
Czy istnieje lepszy typ do użycia dla fetchItems
?
Fsck! to mi się właśnie przydarzyło i stało się tak, ponieważ zbytnio zaufałem WebStormowi - WebStorm nie dodał go automatycznie, a ja nawet nie sprawdziłem, czy ... :-) –
@BoazRymland yep, to dziwne, że nie robi tego ". t nawet ostrzega przed używaniem klasy, która nie jest importowana – yefrem