【发布时间】:2018-03-29 15:07:14
【问题描述】:
我想将一个 Promise 链重构为 async/await,但 Typescript 抱怨打字。
TS2322:类型“IHttpPromiseCallbackArg”不可分配给类型“IResp”...
我认为await 会返回一个常规值,而不是一个承诺。我错了吗?如果是这样,我如何分配类型以便编译所需的代码?
我认为 await 会返回与 .then 回调中的第一个参数相同的值。我错了吗?
旧代码:
handleSubmit(form) {
const params = this.getParams(form);
this.myAsyncRequest(params)
.then((resp:IResp) => this.processResp(resp))
.catch((e:IServerError) => this.handleError(e));
}
所需的新代码:
async handleSubmit(form) {
const params = this.getParams(form);
try {
const resp:IResp = await this.myAsyncRequest(params); //typing error with "const resp:IResp"
this.processResp(resp);
} catch (e:IServerError) {
this.handleError(e);
}
}
如果我删除 myAsyncRequest 中的返回类型,所需的代码仍然会中断;我猜 Typescript 直接从 AngularJS 库中推断出来的。
myAsyncRequest(params:IParams):IHttpPromise<IResp> {
return $http.post('blah', data);
}
如果我从 const resp 声明中删除“IResp”,则 processResponse 会抱怨 IHttp
processResp(resp:IResp) {
//do stuff
}
【问题讨论】:
-
IHttpPromiseCallbackArg 类型不是承诺。这已经是函数调用的实际结果了。见definitelytyped.org/docs/angular-translate--angular-translate/…
-
我可以将我的问题改写为 - “我认为
await会返回与.then回调中的第一个参数相同的值。我错了吗?” -
你是对的。但是你对 then 回调函数中第一个参数的类型是错误的。见definitelytyped.org/docs/angularjs--angular-route/interfaces/…
-
也许您对实际使用的类型定义错误。但是我们需要一个完整的工作示例来明确地说明这一点。
标签: javascript angularjs typescript ecmascript-2017