2017-09-27 1 views
0

Je le code suivantType 'Observable <any>' est incessible taper 'Observable <T>'

import {HttpClient} from '@ngular/common/http'; 

private httpClient: HttpClient; 

do_request(method: string,               
     url: string,                
     headers?: HttpHeaders,             
     content?: string,               
     contentType?: string): Observable<MyResponse>{      

    let options = {                 
     observe: 'response' as 'response',           
     responseType: 'text' as 'text',            
     headers: headers, 
     body: content:                   
    } 

    return this.httpClient.request(method, url, options)       
      .map(res=> new MyResponse(res.status, res.body))     
      .catch(err=>Observable.throw(new MyResponse(err.status)));      
}  

Ce code me donne l'erreur suivante

error TS2322: Type 'Observable' is not assignable to type 'Observable'. Property 'source' is protected but type 'Observable' is not a class derived from 'Observable'

J'utilise Rxjs 5.4 .3, Angular 4.4.3 et TypeScript 2.5.3.

que j'ai trouvé plusieurs sources d'erreur possibles et ont essayé les solutions proposées sans succès:

  • Typescript version (je rétrogradé à 2,3 avec des résultats similaires)
  • importation d'un package qui a aussi une dépendance à l'égard rxjs using npm link (je l'ai installé localement, avec le même résultat).

J'apprécierai toute suggestion sur la façon de résoudre ce problème.

+0

Est-ce que cela se produit si vous supprimez le bloc' catch'? – Meir

+0

@Meir L'erreur change: Le type 'Observable ' n'est pas assignable au type 'Observable '. Deux types différents avec ce nom existent, mais ils ne sont pas liés. J'ai supprimé la dépendance dupliquée dans mon code (comme je l'ai expliqué dans les questions). Mais peut-être cela est lié au fait que j'utilise un nouveau module angulaire/commun/http – pablochacin

Répondre

0

Sur la base de votre commentaire, je pense que vous devriez être explicite dans votre typages, par conséquent, l'importation Observable et déclarer les types:

return this.httpClient.request(method, url, options)       
     .map((res): MyResponse => new MyResponse(res.status, res.body))     
     .catch((err):Observable<MyResponse> => Observable.throw<MyResponse>(new MyResponse(err.status))); 

L'important est que le throw (ainsi que from et d'autres opérateurs) peut être tapé et la syntaxe est `Observable.operator (opérandes ...)

+1

Apparemment, cela a résolu le problème, mais maintenant j'ai l'erreur: Type 'Observable ' n'est pas assignable au type 'Observable < SeamHttpResponse> '. Deux types différents avec ce nom existent, mais ils ne sont pas liés. La propriété 'source' est protégée mais le type 'Observable ' n'est pas une classe dérivée de 'Observable ' Je suppose que cela a à voir avec un paquet ayant une dépendance de rxjs. Je dois vérifier cela avant de pouvoir confirmer la solution. Merci – pablochacin

+0

Vous ne pouvez pas appliquer la même solution à la nouvelle erreur? – Meir

+0

Apparemment, cette nouvelle erreur est due au fait que j'importe deux fois le fichier rxjs. Je m'attendais à ce que cela arrive à un moment donné, j'ai ouvert une autre question à ce sujet. – pablochacin