【发布时间】:2018-01-21 07:48:27
【问题描述】:
处理错误和使用 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>。这两个提交似乎都没有在现实生活中编译。
【问题讨论】:
-
promise 的泛型类型约束仅指
resolve类型。reject类型始终为any。 -
@NitzanTomer 在我看来你是不对的。 Typescript 期望
reject类型与resolve类型相同 -
不,它没有。无论解析类型如何,拒绝类型始终为
any。当您说Promise<string>时,只有解析类型是string,拒绝类型可以是任何类型(any) -
你不想要
Promise<DataType[] | Error>你只想要Promise<DataType[]> -
@NitzanTomer @Ben 我创建了一个存储库,其中放置了无法以任何方式编译的代码,带有` |错误`或没有它。 github.com/easy-one/promise_typescript
标签: typescript angular-promise angular-services typescript2.0 typescript-generics