Свойство 'error' не существует для типа '"" / Promise '

Я пытаюсь добавить некоторую обработку ошибок в службу, следуя угловому руководство.

соответствующий фрагмент:

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

тем не менее, я получаю ошибку TypeScript:

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

Я понимаю почему это случилось...error.json() возвращает Promise<any> а затем следующая строка с body.error не будет работать, потому что нет error собственность. Однако, похоже, следует ожидать, что объект JSON быть возвращенным из .json(). Почему это, и что мне не хватает, что угловой направляющий не является?

3 ответов


то же самое случилось со мной. Это происходит, когда не удается импортировать объект Response.

import { Response } from '@angular/http';

нет, это не сработает, потому что ты написал:

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

что означает body может быть пустой строкой, а строку нет error собственность.

это должно быть лучше:

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

редактировать

о error.json() возвращает Promise, что означает, что вы не сможете использовать этот синхронный блок, вместо этого вам потребуется:

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

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

У меня была такая же проблема, я, наконец, нашли это решение.

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