forkJoin 打字稿输入错误
Typescript typing error with forkJoin
我在使用 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 我想要的帽子的输入?
尝试使用 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
,这就是您提到的错误会受到影响的原因。 (你不能断言可能是 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[]
.
我在使用 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 我想要的帽子的输入?
尝试使用 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
,这就是您提到的错误会受到影响的原因。 (你不能断言可能是 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[]
.