【问题标题】:angular2 TS2322 Type 'Promise<void>' is not assignable to type 'Promise<string>' when given a stringangular2 TS2322 类型“Promise<void>”在给定字符串时不可分配给类型“Promise<string>”
【发布时间】:2017-10-23 23:46:18
【问题描述】:

使用 Angular 2,我有一个服务来处理我的 API 调用。在服务中,我有一个 handleError 函数,它为错误消息返回 Promise&lt;string&gt;。我正在尝试向 handleError 添加一些功能,如果出现凭据错误,它将在之后将页面重定向到登录屏幕。当我这样做时,TypeScript 会引发 TS2322 错误,即使我正在返回相同的 Promise,然后尝试从中执行一些链。

错误 TS2322:类型“Promise”不可分配给类型 '承诺'。类型 'void' 不能分配给类型 'string'。

private handleError(error: Error): Promise<string> {
    let message = "Something went wrong loading data from the API.";
    if (error.response.status === 0) {
      message = "Unable to contact server.  Please file a bug report.";
    }
    if (error.message) {
      message = "API Service Error retrieving page: " + error.message;
    }
    this.alerts.error(message);
    if (error.response.status === 403) {
      if (error.message.indexOf("Authentication credentials") !== -1) {
          return Promise.reject<string>(message)  // this line errs with TS2322
          .then(() => this.appState.refresh())
          .then(() => this.redirects.login())
          .then(() => this.alerts.warning("Redirected to login because no credentials found."));
      } else {
          this.redirects.index();
      }
    }
    return Promise.reject<string>(message);
}

【问题讨论】:

  • 您的任何then() 回调都不会运行,因为您的承诺被拒绝了。

标签: javascript angular


【解决方案1】:
      return Promise.reject<string>(message)  // this line errs with TS2322
      .then(() => this.appState.refresh())
      .then(() => this.redirects.login())
      .then(() => this.alerts.warning("Redirected to login because no credentials found."));

Typescript 对你大喊大叫,因为 appState.refreshredirects.loginalerts.warning 返回一个 void 值。要正确链接它,请使用链设置一个变量,然后返回该变量:

    let result = Promise.reject<string>(message);

      result.then(() => this.appState.refresh())
            .then(() => this.redirects.login())
            .then(() => this.alerts.warning("Redirected to login because no credentials found."));

    return result;

还值得一提的是,thens 不会因为你的 Promise 被拒绝而被调用。

【讨论】:

  • 如何指示出现错误 (Promise.reject()) 然后发生其他操作?
  • 您可以将第一个 then 更改为 catch,或者您可以在之后直接使用链调用 this.appState.refresh(),因为它们不需要原始 Promise.reject 中的值.
猜你喜欢
  • 2021-11-05
  • 2018-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-18
相关资源
最近更新 更多