2016-10-25 9 views
7

Öğelerin listesini getiren bir hizmeti olan bir Angular2 uygulamasına sahibim. Listedeki her bir öğe için daha spesifik bilgi almak için bir yöntem vardır. Ben dizi < => gözlemlenebilir biraz korkak görünüyor için olsa gerek gibi bu aslında tam olarak çalışırGözlemlenebilir zincirleme sırasında türleri doğru bir şekilde anlayabilme

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

, ama bana hepsi ile öğelerin bir dizinin bir gözlemlenebilir veren sonu gelmez: Benim şu anki kurulumdur madde bilgisinin

sorun, return this.fetchItems() hattında hep olsun edilmektedir:

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

Ben Observable<any> değiştirmeyi bir Observable ve çıkmıyor fetchItems beri kayıp biraz yaşıyorum aynı verir hata. Herhangi bir hata raporu almama rağmen any'a değiştirirsem.

fetchItems için daha iyi bir türü var mı?

cevap

1

  • fetchData(item: Item): ItemData ve .map((item: Item): ItemData => this.itemService.fetchData(item)) Bu Observable<T[]> döndürür toArray() ile ilgili bir şey olabilir şüpheli değilim. o toArray() yapar fetchItems(): Observable<Item[]> tanımlamak Senin durumunda

    bile Observable<any> içeren bir hata verir yüzden bu yüzden Observable<Observable<Item[]>[]> dönmek için.

    Btw Ben sadece sahte sınıfları ile durumunu taklit etmeye çalıştı ve hataların (typescript 2.0.3) olmadan derlenmiş ama belki yapılmış bir hata yere ve onun aynı değil (?):

    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

    deneyin haritalarınıza türü bilgisine döndü ve dizi ek açıklamaları değiştirmek eklenmesi:

    1. yerine Item[] arasında, Array<Item> kullanın.
    15

    zaman

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

    o birilerine yardımcı olur umarım: aynı konuda koştu, nedeni Response sınıfını içe unuttum olmasıydı.

    +0

    Fsck! Bu sadece bana oldu ve WebStorm'a çok fazla güvenmeye başladığımdan beri oldu - WebStorm bunu otomatik olarak eklemedi ve ben de bunu kontrol etmedim bile ... :-) –

    +1

    @BoazRymland yep, bu hiç de tuhaf değil t bile, içe aktarılmayan sınıfı kullanma konusunda uyar – yefrem

    İlgili konular