【问题标题】:Typescript typing error with forkJoin使用 forkJoin 的打字稿输入错误
【发布时间】:2018-01-26 02:05:39
【问题描述】:

我在使用 RxJS 形式的 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;
        });

tsc 发出的错误是:

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

我对forkJoin的理解是data[0]应该是Product[],data[1]应该是Loan,但是tsc似乎不同意。我的理解不正确吗?我是否错过了一些可以告诉 tsc hat 我想要的类型?

【问题讨论】:

  • lead.Loan = data[1];返回线索; .map 和 Observable 已经用完了,但我可能会被误导

标签: angular typescript observable rxjs5 fork-join


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 第二种签名类型有 6 个限制。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-12
    • 2016-08-12
    • 2017-05-29
    • 1970-01-01
    • 2016-06-14
    相关资源
    最近更新 更多