4

处理错误并使用 Promises 的简单通用的 Angular2+ 数据服务:

// imports skipped

class DataType {}

class Error {
  constructor(error: HttpResponse) {
    this.error = error.json()
  }
}


@Injectable()
export class MyService<DataType> {
  apiUrl = 'my/url';
  constructor(protected http) {}

  get(): Promise<DataType[] | Error> {
    return this.http
    .get(this.apiUrl)
    .toPromise()
    .then(response => response.json())
    .catch(this.handleError);
  }

  protected handleError(error: HttpResponse): Promise<Error> {
    console.error('An error occurred', error);
    return Promise.reject(new Error(error));  
  }
}

在这个类中,get方法返回一个 Promise,它用数组解析,用类型DataType[]拒绝。Error

编译此代码,我收到此错误:

输入“错误 | DataType[]' 不可分配给类型 'DataType'。类型“错误”不可分配给类型“数据类型”。

我正在使用 TypeScript 2.4.2 版。我确信这在 TypeScript 升级后开始发生,这使得类型检查更加严格。

我想知道如何在最新的 TypeScript 中处理不同类型的拒绝。这样做有不同的做法吗?

更新:我找到了相应的错误报告,尚未解决https://github.com/Microsoft/TypeScript/issues/7588

更新

我创建了一个 repo 来展示这个问题,有两个提交。第一次提交使用<TypeResolve | TypeReject>方法,第二次<TypeResolved>仅使用。这两个提交似乎都没有在现实生活中编译。

4

1 回答 1

4

for 的类型参数Promise只是 for 的类型.resolve,而不是 for的类型.reject。的类型.reject总是any,因为在编译时无法知道类型。造成这种情况的原因之一是async返回承诺的函数可能会拒绝它们的承诺,但有任何例外。

您应该改为编写Promise<DataType[]>,并在处理错误的运行时检查错误类型。

于 2017-08-13T16:39:26.233 回答