Ошибка ввода машинописного текста с помощью forkJoin
Я испытываю ошибку проверки типа TypeScript при использовании оператора forkJoin из формы RxJS. Это код вопроса:
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, похоже, не согласен. Мое понимание неверно? Я скучаю по тому, как печатать, что бы я сказал, что я хочу?
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];
})
Есть многочисленные перегрузки подписи для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[]
,