2017-08-17 7 views
1

forkJoinオペレータフォームRxJSを使用しているときに、TypeScriptタイプのチェックに失敗しました。エラーTSCが放出さforkJoinのtypescriptタイピングエラー

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

である: これは、問題のコードは

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

forkJoinの私の理解は、データが[0]であるべきであるということである商品[]とデータ[1]ローンでなければならないが、tscは同意していないようだ。私の理解は間違っていますか?私は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]) 

一致の署名はこの1つです:ので、すべての単一の型変数があることを

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

注(T)、は、単一のタイプであると推定される。そしてTProduct[] | Loanとなりますので、上記のエラーが発生します。 (あなたは、潜在的にLoanProduct[]であることができることが何かを主張することはできません。)

をあなたの代わりに別の引数を指定した場合:

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

そして:

Observable.forkJoin(products, loans) 

をそれはこの署名と一致します出力された値はタプルタイプ[Product[], Loan]になり、TypeScriptはdata[0]Product[]であることを知るため、エラーは発生しません。

関連する問題