2017-09-27 3 views
0

Ich habe den folgenden CodeTyp 'beobachtbar <any>' ist nicht übertragbar 'beobachtbar <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)));      
}  

Dieser Code eingeben müssen, wird mir die folgende Fehlermeldung geben

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

Ich verwende Rxjs 5.4 .3, Angular 4.4.3 und TypeScript 2.5.3.

  • Typescript version (I herabgestuft auf 2,3 mit ähnlichen Ergebnissen)
  • Importieren eines Pakets, das auch eine Abhängigkeit von rxjs hat:

    Ich habe mehrere mögliche Fehlerquellen und versucht, die vorgeschlagenen Lösungen ohne Glück gefunden using npm link (Ich habe es lokal installiert, mit dem gleichen Ergebnis).

Ich freue mich über jeden Vorschlag, wie Sie dieses Problem beheben können.

+0

Kommt es vor, wenn Sie den' catch' Block entfernen? – Meir

+0

@Meir Der Fehler ändert sich: Typ 'Observable ' ist nicht dem Typ 'Observable ' zuweisbar. Zwei verschiedene Typen mit diesem Namen existieren, aber sie sind nicht verwandt. Ich entfernte die doppelte Abhängigkeit in meinem Code (wie ich in den Fragen erklärte). Aber vielleicht hängt das mit der Tatsache zusammen, dass ich das neue eckige/common/http-Modul verwende – pablochacin

Antwort

0

Basierend auf Ihrem Kommentar, ich glaube, Sie sollten in Ihrer Typisierung, damit Import beobachtbar und erklären die Typen explizit sein:

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

Der wichtige Teil ist, dass die throw (sowie from und andere Betreiber) kann getippt werden und die Syntax ist `Observable.operator (Operanden ...)

+1

Offensichtlich löste das das Problem, aber jetzt habe ich den Fehler: Typ 'Observable ' kann nicht dem Typ 'Observable' zugewiesen werden SeamHttpResponse> '. Zwei verschiedene Typen mit diesem Namen existieren, aber sie sind nicht verwandt. Eigenschaft 'source' ist geschützt, aber Typ 'Observable ' ist keine Klasse abgeleitet von 'Observable ' Ich denke, das hat mit einem Paket zu tun, das eine Abhängigkeit von rxjs hat. Ich muss das verifizieren, bevor ich die Lösung bestätigen kann. Danke – pablochacin

+0

Können Sie nicht die gleiche Lösung auf den neuen Fehler anwenden? – Meir

+0

Anscheinend ist dieser neue Fehler, weil ich die Rxjs zweimal importiere. Ich hatte erwartet, dass dies irgendwann passieren würde. Ich öffnete eine andere Frage für dieses Problem. – pablochacin

Verwandte Themen