使用forkJoin输入打字稿错误

时间:2017-08-17 15:09:02

标签: angular typescript observable rxjs5 fork-join

使用forkJoin运算符表格RxJS时,我遇到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;
        });

tsc发出的错误是:

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

我对forkJoin的理解是数据[0]应该是Product [],数据[1]应该是贷款,但是tsc似乎不同意。我的理解不正确吗?我错过了一些能说出我想要的东西的打字吗?

2 个答案:

答案 0 :(得分: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];
  })

答案 1 :(得分:1)

有很多signature overloads for forkJoin

当您致电forkJoin时,传递数组:

Observable.forkJoin([products, loans])

匹配的签名就是这个:

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

请注意,只有一个类型变量(T),因此所有数组元素都被推断为单一类型。 T将为Product[] | Loan,这就是您提到的错误受影响的原因。 (你不能断言可能是Loan的东西是Product[]。)

如果您指定单独的参数:

Observable.forkJoin(products, loans)

它将匹配此签名:

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

并且发出的值将具有元组类型[Product[], Loan]并且错误不会受到影响,因为TypeScript将知道data[0]Product[]