TS2740错误:Promise类型缺少JQueryPromise的state等属性如何解决
错误根源
你的代码存在类型不匹配问题:
- Angular
HttpClient调用toPromise()返回的是标准ES Promise,仅支持then/catch/finally方法 - 你在
AgentManager.getStyleGuideByAgentId方法中声明的返回类型是JQueryPromise,该类型是jQuery独有的Promise实现,额外扩展了fail/done/always等标准Promise没有的方法,TypeScript检查时发现类型不一致就抛出了TS2740错误。
推荐解决方案(优先用标准Promise,符合现代前端规范)
- 修改AgentManager方法的返回类型声明
// 把返回类型从JQueryPromise<any>改成Promise<any> getStyleGuideByAgentId(Id: number): Promise<any> { var request = this.agentsService.getStyleGuideByAgentId(Id); console.log(request); return request; }
- 把调用处的jQuery风格的
fail方法换成标准Promise的catch方法
var responsePromse = this.agentManager.getStyleGuideByAgentId(this.model.Id); responsePromse.then((response) => { // 额外注意:后端返回的是数组,你直接取response.responseObject.Name可能会报错,建议先判断数组长度再取对应元素的属性 this.styleguideNote.AgentType = response[0].AgentType; }).catch(() => { this.relatedTemplates.loadingState = 0; });
备选方案(如果你必须保留JQueryPromise的写法)
可以把标准Promise用jQuery的$.when方法包裹,转换成JQueryPromise类型:
getStyleGuideByAgentId(Id: number): JQueryPromise<any> { var request = this.agentsService.getStyleGuideByAgentId(Id); console.log(request); // 用$.when转换标准Promise为JQueryPromise return $.when(request); }
这种方案不需要修改调用处的fail写法,但是不推荐长期使用,jQuery的Promise属于过时的异步实现规范。
内容的提问来源于stack exchange,提问作者Jefferson
相关产品推荐
相关产品推荐

