2017-08-17 4 views
1

Je rencontre un échec de vérification de type TypeScript lors de l'utilisation de l'opérateur forkJoin RxJS. Voici le code en question:Erreur typographique avec forkJoin

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; 
     }); 

Le centre technique d'erreur émet est:

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

Ma compréhension de forkJoin est que les données [0] devrait être un produit [] et des données [1] devrait être un prêt, mais tsc semble être en désaccord. Ma compréhension est-elle incorrecte? Ai-je manqué une frappe qui dirait que je veux?

+0

lead.Loan = données [1]; retour de plomb; est hors de .map et retours Observable déjà, mais je peux être égaré – Vega

Répondre

2

Essayez d'utiliser Observable.forkJoin sans passer dans un tableau.

// 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]; 
    }) 
0

Il existe de nombreux signature overloads for forkJoin.

Lorsque vous appelez forkJoin, en passant un tableau:

Observable.forkJoin([products, loans]) 

La signature qui est adapté est celui-ci:

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

Notez qu'il n'y a qu'une seule variable de type (T), de sorte que tous des éléments du tableau sont supposés être un seul type. Et T sera Product[] | Loan, ce qui explique pourquoi l'erreur que vous avez mentionnée est effectuée. (Vous ne pouvez pas affirmer que quelque chose qui pourrait potentiellement être un Loan est un Product[].)

Si vous spécifiez des arguments distincts à la place:

Observable.forkJoin(products, loans) 

Il correspondra à cette signature:

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

Et la la valeur émise aura un type de ligne [Product[], Loan] et l'erreur ne sera pas affectée, car TypeScript saura que data[0] est un Product[].