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



简单而常见的 Angular2+ 数据服务,用于处理错误并使用 Promises:

// 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,该 Promise 使用DataType[]数组进行解析,并使用Error类型进行拒绝。

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

键入"错误 |数据类型[]"不能分配给类型"数据类型"。类型"错误"不可分配给类型"数据类型"。

我使用的是 TypeScript 版本 2.4.2。我敢肯定,这在 TypeScript 升级后开始发生,这使得类型检查更加严格。

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

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

更新

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

Promise的类型参数只是.resolve的类型,而不是.reject的类型。.reject的类型总是any的,因为该类型在编译时是未知的。其中一个原因是,返回承诺的async函数可能会拒绝其承诺,但有任何例外。

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

相关内容

最新更新