Ошибка ввода машинописного текста с помощью 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[],

Другие вопросы по тегам