2016-10-25 21 views
7

Tôi có ứng dụng Angular2 có dịch vụ tìm nạp danh sách các mục. Có một phương pháp để tìm nạp thêm thông tin cụ thể cho mỗi mục trong danh sách. thiết lập hiện tại của tôi là:Đúng khi suy luận các loại khi chuỗi quan sát

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

này thực sự hoạt động chính xác như tôi cần nó để mặc dù mảng < => quan sát dường như một chút sôi nổi, nhưng nó kết thúc đem lại cho tôi một quan sát của một loạt các mặt hàng với tất cả của thông tin mục.

Vấn đề là, trên dòng return this.fetchItems() tôi luôn luôn nhận được:

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[]>'. 

Tôi đang ở một chút của một sự mất mát kể từ fetchItems không trả về một Observable và thay đổi nó để Observable<any> cho cùng lỗi. Nếu tôi chỉ thay đổi nó thành any mặc dù tôi không nhận được bất kỳ báo cáo lỗi nào cả.

Có loại nào tốt hơn để sử dụng cho fetchItems không?

Trả lời

1

Tôi nghi ngờ điều này có thể có cái gì để làm với toArray() trả về Observable<T[]>.

Trong trường hợp bạn xác định fetchItems(): Observable<Item[]>, nó làm cho toArray() trả về Observable<Observable<Item[]>[]> vì vậy đó là lý do tại sao nó phát ra lỗi ngay cả với Observable<any>.

Btw tôi đã cố gắng để mô phỏng tình hình của bạn với các lớp học chỉ giả và nó được biên dịch mà không có lỗi (nguyên cảo 2.0.3) nhưng có lẽ tôi đã thực hiện một lỗi ở đâu đó và nó không giống hệt nhau (?):

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

thử thêm lại thông tin loại để bản đồ của bạn và thay đổi chú thích mảng của bạn:

  1. Thay vì Item[], sử dụng Array<Item>.
  2. fetchData(item: Item): ItemData.map((item: Item): ItemData => this.itemService.fetchData(item))
15

Khi tôi chạy vào cùng một vấn đề, lý do là tôi quên nhập Response lớp:

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

Hy vọng nó sẽ giúp ai đó.

+0

Fsck! điều đó đã xảy ra với tôi và điều đó đã xảy ra kể từ khi tôi tin tưởng WebStorm quá nhiều - WebStorm không tự động thêm nó, và tôi thậm chí không kiểm tra ... :-) –

+1

@BoazRymland yep, thật lạ lùng là nó không có thậm chí còn cảnh báo về việc sử dụng lớp không được nhập – yefrem

Các vấn đề liên quan