TypeScript泛型:如果Promise拒绝和解析类型有所不同,该怎么办?

时间:2017-08-13 07:30:53

标签: typescript angular-promise angular-services typescript2.0 typescript-generics

处理错误并使用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类型。

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

  

键入&#39;错误|字段类型字段[]&#39;不能分配类型&#39; DataType&#39;。输入&#39;错误&#39;不能分配给&#39; DataType&#39;。

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

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

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

更新

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

1 个答案:

答案 0 :(得分:3)

Promise的类型参数只是.resolve的类型,而不是.reject的类型。 .reject的类型始终为any,因为在编译时无法识别该类型。其中一个原因是,返回承诺的async函数可能会在任何例外情况下拒绝承诺。

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