2017-08-17 46 views
1

使用forkJoin操作員窗體RxJS時,遇到TypeScript類型檢查失敗。 這是有問題的代碼:使用forkJoin的打字稿打字錯誤

let products = this.http.get(productUrl, { headers: this.headers }) 
      .map(response => response.json().data as Product[]); 
     let loans = Observable.of(loan); 

     return Observable.forkJoin([products, loans]) 
      .map(data => { 
       let resultProducts = data[0] as Product[]; 
       if (resultProducts.length > 0) { 
        lead.Product = resultProducts.find(i => i.ID == productId); 
      } 
      lead.Loan = data[1]; 
      return lead; 
     }); 

誤差TSC正在發射是:

Type 'Loan' cannot be converted to type 'Product[]'. 

我forkJoin的理解是,數據[0]應該是一個產品[]和數據[1]應該是貸款,但TSC似乎不同意。我的理解不正確?我是否錯過了一些會告訴我想要的帽子的打字?

+0

lead.Loan = data [1];迴歸主導;已經超出.map並且Observable已經返回,但我可能被誤導了 – Vega

回答

2

嘗試使用Observable.forkJoin而不傳入數組。

// forkJoin with array 
return Observable.forkJoin([products, loans]) 
// forkJoin without array 
return Observable.forkJoin(products, loans) 
    .map(data => { 
    let resultProducts = data[0] as Product[]; 
    // ... 
    lead.Loan = data[1]; 
    }) 
0

有很多signature overloads for forkJoin

當你調用forkJoin,傳遞一個數組:

Observable.forkJoin([products, loans]) 

多數民衆贊成匹配的簽名是這樣一個:

static create<T>(
    sources: SubscribableOrPromise<T>[] 
): Observable<T[]>; 

注意,只是有單一類型的變量(T),因此所有的數組元素被推斷爲單一類型。而T將是Product[] | Loan,這就是爲什麼你提到的錯誤是有效的。如果指定單獨的參數,而不是(您不能斷言的東西,可能是LoanProduct[]。)

Observable.forkJoin(products, loans) 

它將匹配此簽名:

static create<T, T2>(
    v1: SubscribableOrPromise<T>, 
    v2: SubscribableOrPromise<T2> 
): Observable<[T, T2]>; 

而發射值將有一個元組類型[Product[], Loan]並且錯誤不會受到影響,因爲TypeScript將知道data[0]Product[]