【问题标题】:Property 'error' does not exist on type '"" | Promise<any>'类型 '"" 上不存在属性 'error' |承诺<任何>'
【发布时间】:2017-06-21 03:00:38
【问题描述】:

我正在尝试向服务添加一些错误处理,遵循 Angular guide

相关sn-p:

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&lt;any&gt;,然后带有body.error 的后续行不起作用,因为没有error 属性。但是,它似乎应该期望从.json() 返回一个 JSON 对象。为什么会这样,我错过了 Angular 指南没有的什么?

【问题讨论】:

  • 您对 Response 的导入情况如何?
  • 我没有任何明确的导入,我应该这样做吗?看起来当我在 WebStorm 上单击 cmd 时它会转到 JavaScriptLanguage/jsLanguageServicesImpl/external/lib.d.ts
  • 刚刚意识到我需要import { Response } from @angular/http,没有它我会从 JavaScript 获取响应接口,而不是 Angular 定义的不返回 Promise 的接口。

标签: angular typescript


【解决方案1】:

同样的事情也发生在我身上。当您无法导入 Response 对象时会发生这种情况。

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

【讨论】:

  • 你必须导入什么响应对象?
  • @adam-beck 添加了它
  • 啊,谢谢!我的 IDE 可以识别 Response,但它不是 Angular 的。这完全有道理。
【解决方案2】:

不,它不会起作用,因为你写了:

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

【讨论】:

  • 错误现在正在查看 Promise:我将行更改为类似于:const body = error.json() || { error: '' };,现在出现错误error TS2339: Property 'error' does not exist on type 'Promise&lt;any&gt; | { error: string; }'. Property 'error' does not exist on type 'Promise&lt;any&gt;'.
  • 检查我修改后的答案
【解决方案3】:

我遇到了同样的问题,我终于找到了这个解决方案。

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

【讨论】:

    猜你喜欢
    • 2017-10-13
    • 2021-11-26
    • 1970-01-01
    • 1970-01-01
    • 2017-01-29
    • 2021-10-10
    • 1970-01-01
    • 1970-01-01
    • 2021-01-09
    相关资源
    最近更新 更多