Type ‘void’ is niet overdraagbaar naar type ‘ObservableInput<{}>’

Deze fout begon te pop-up nadat ik gemigreerd naar TS 2.2.2, dus ik ga ervan uit, dat is het probleem… De code niet meer werkt, maar nu krijg ik die fout en ik probeerde een paar dingen, zoals het retourneren van een lege waarneembare, het vangen van de re-gegooid uitzondering en het retourneren van een object, niets leek te werken. Waarom gebeurt dit nu? Mag het niet begrijpen ik ben opnieuw gooien van de uitzondering en niet verwachten dat een terugkeer? Ben ik misinterpretatie de fout?

Dit is de volledige beschrijving van de fout:

Type 'void' is niet overdraagbaar naar type 'ObservableInput<{}>'

Hier is de volledige code:

return request
    .map((res: Response) => res.json())
    .catch((error: any) => {
        //todo: log?

        if (error.status == 500) {
            this.alertService.showError(error.statusText);
        } else if (error.status == 588) {
            this.alertService.showAlert(error.statusText);
        }

        Observable.throw(error.statusText);
    });

Ik probeerde het retourneren van het Waarneembare, maar mijn wrapper methode verwacht een terugkeer van het type T, dat is de terugkeer van mijn gedeserialiseerd aanvraag (map(...)). Als ik terug de throw dit is de error die ik krijg:

[ts] Type ‘Waarneembare’ is niet overdraagbaar naar type ‘T’

Ik gebruik:

  • Angular4
  • Getypte versie 2.2.2
InformationsquelleAutor eestein | 2017-03-30

 

3 Replies
  1. 62

    u de Waarneembare

     return request
        .map((res: Response) => res.json())
        .catch((error: any) => {
            //todo: log?
    
            if (error.status == 500) {
                this.alertService.showError(error.statusText);
            } else if (error.status == 588) {
                this.alertService.showAlert(error.statusText);
            }
    
            return Observable.throw(error.statusText);
        });
    • Hey bedankt voor je antwoord, ik had geprobeerd dat voor. Het werkt niet omdat mijn wrapper methode verwacht een terugkeer van het type T. controleer mijn bijgewerkt vraag. Het spijt me dat ik vergeten toe te voegen dat. Nogmaals bedankt.
    • Bougarfaoui, ik ben markering geeft aan dat dit als antwoord, want ik was in staat om het probleem nu 🙂 Na uw antwoord heb ik besloten om meer te kijken zorgvuldig naar de code en ik moet inderdaad terug (hoewel het concept is nog steeds een beetje raar voor mij, want het wordt opnieuw gegooid), maar het probleem was dat het verwachte rendement van mijn wrapper methode. Zodra ik dat veranderd te verwachten Waarneembare<B> het werkte. Dank u.
    • Let op dat de opdracht is nu Observable.throwError (in plaats van alleen .throw) na de RxJS update.
  2. 7

    Soms wanneer u een oproep vangen zonder het gebruik van pijl functie zoals hieronder

    getUserList() {
        return this.http.get(this.constURL + '/api/url/here', this.headerOptions)
        .catch(this.handleError);
    }
    
    handleError(error: Response) {
        if (error.status == 500) {      
          this.router.navigate(['/login']);
        } else {
          return Observable.throw(error);
        }
    }

    dan geeft de fout van

    FOUT TypeError: kan Niet lezen eigenschap ‘navigeren’ undefined niet aan deze

    Omdat in handleError functie van dit object is niet toegankelijk..als je deze console.router dan krijgt u undefined..
    dus dit object niet werken en niet aan de router van alle beschikbare methoden

    Dus je moet gebruik pijl-functie hier, zoals hieronder

    getUserList() {
        return this.http.get(this.constURL + '/api/url/here', this.headerOptions)
        .catch(error => { 
          return this.handleError(error);
        });
    }
    
    handleError(error: Response) {
        if (error.status == 500) {      
          this.router.navigate(['/login']);
        } else {
          return Observable.throw(error);
        }
    }

    Ook als u niet hebben genoemd ruil voor handlerError functie dan zal gooien fout weer als

    Argument van het type ‘(fout: eventuele) => void’ is niet overdraagbaar naar de parameter van het type

    Dus is het noodzakelijk om een soort ruil voor handlerError functie.

    Controleren hier in detail.Hij heeft uitgelegd code heel goed met alle mogelijke fouten en de oplossing van dat..werkte voor mij

    • Je moet echt niet het plakken van een lang fragment van de productie code van een andere app die niet is gerelateerd aan de OP het antwoord. Het is verwarrend voor de mensen die het lezen van het antwoord en het is een beetje nutteloos op.
    • Hi tshm001, ik denk dat ik probeerde uit te leggen code nodig voor OP de vraag. Het is niet de productie code, maar maakte het leesbaar is door het toevoegen van enkele werkelijke diensten namen..laat het me weten als er wijzigingen nodig zijn, zal ik doen..Bedankt
  3. 5

    Dit is een antwoord voor de hoekige 6 met RXJS 6.
    In uw functie, het zou er ongeveer zo uitzien. Merk op dat catch is vervangen door catchError en Observable.throw is nu throwError. Ook in RXJS 6 gebruiken we de pijp om samen een reeks van de functie die we willen uitvoeren in plaats van de dot-chaining eerder.

    //In your service
    
    getData(url: string): Observable<any> {
        let options = this.getHTTPOptions();
        return this.http.get<any>(url, options).pipe(
              catchError( (err: any, caught: Observable<any>) => { return 
            throwError(this.generalErrorHandler(err, caught)) } ) );
    }

    Dan kunt u een fout van de handler. De sleutel is om het sleutelwoord return in zowel de catchError bovenstaande functie en de terugkeer van de fout in de handler.
    De pijl ( => ) kunt u doorgeven in de context van de aanroepende functie in de fout van de handler, die betekent dat u kunt doen leuke dingen zoals this.router.navigate(['someroute']); (Als u de router geïmporteerd in uw service)

    //In your service
    
      generalErrorHandler(error: any, caught: Observable<any>): Observable<any> {
        console.log('error caught: ', error);
        if( error.error.status == "INVALID_TOKEN" || error.error.status == "MAX_TOKEN_ISSUE_REACHED"){
          console.log('token has expired');
          this.logout();
          return error;
        }
        return error;
      }

    Een aantal belangrijke invoer om dit werk te krijgen:

    //Imports for the service
    
    import { HttpClient, HttpHeaders, HttpErrorResponse } from '@angular/common/http';
    import { Http, Response } from '@angular/http';
    import { catchError, map } from 'rxjs/operators';
    import { Observable, throwError, of} from 'rxjs';

    En ten slotte om je te abonneren op het verzoek om uw gegevens:

    //In your component, don't forget to import your service
    
    let response$ = this.someService.getData('url here');
    response$.subscribe( 
        data => { console.log('do stuff to data here', data); },
        err => { console.log("couldn't get data, maybe show error to user"); },
        () => { console.log('function that is called upon finish'); }
    );

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *