使用forkJoin的打字稿打字错误

问题描述:

使用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

尝试使用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]; 
    }) 

有很多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[]