web-dev-qa-db-fra.com

La propriété 'erreur' n'existe pas sur le type '"" | Promesse <tout> '

J'essaie d'ajouter un traitement d'erreur à un service en suivant le Angular guide

Extrait pertinent:

private handleError (error: Response | any) {
  // In a real world app, you might use a remote logging infrastructure
  let errMsg: string;
  if (error instanceof Response) {
    const body = error.json() || '';
    const err = body.error || JSON.stringify(body);
    errMsg = `${error.status} - ${error.statusText || ''} ${err}`;
  } else {
    errMsg = error.message ? error.message : error.toString();
  }
  console.error(errMsg);
  return Observable.throw(errMsg);
}

Cependant, je reçois une erreur TypeScript:

error TS2339: Property 'error' does not exist on type '"" | Promise<any>'. Property 'error' does not exist on type '""'.

Je peux comprendre pourquoi cela se produit-- error.json() renvoie un Promise<any> et la ligne suivante contenant body.error ne fonctionnerait pas car il n'y a pas de propriété error. Cependant, il semble qu'il faut s'attendre à ce qu'un objet JSON soit renvoyé à partir de .json(). Pourquoi cela et que me manque-t-il si le guide Angular n’est pas?

7
tofu

La même chose vient de m'arriver. Cela se produit lorsque vous ne parvenez pas à importer l'objet Response.

import { Response } from '@angular/http';
24
Marcelo Mason

Non, ça ne marchera pas parce que vous avez écrit:

const body = error.json() || '';

Ce qui signifie que body peut être une chaîne vide et qu'une chaîne ne possède pas la propriété error.

Cela devrait être mieux:

const body = error.json() || { error: null };

Modifier

Oh, error.json() renvoie une Promise, ce qui signifie que vous ne pourrez pas utiliser ce bloc synchrone. Vous devrez plutôt:

error.json().then(body => {
    if (!body) {
        body = "";
    }

    const err = body.error || JSON.stringify(body);
    const errMsg = `${error.status} - ${error.statusText || ''} ${err}`;
});
0
Nitzan Tomer

J'ai eu le même problème, j'ai finalement trouvé cette solution.

.catch(error => {
  let errMsg: string;
  const body = JSON.parse(error._body);
  if (body) {
    errMsg = body.error
  } else {
    errMsg = error.message ? error.message : error.toString();
  }
  console.error(errMsg);
  return Promise.reject(errMsg);
});

0
Thomas PAPIN