问题描述
uni.request 的 Typescript 类型定义为
request(options?: RequestOptions): RequestTask;
(@dcoudio/types/uni-app/uni.d.ts:60)
官方文档描述支持返回 Promise 对象
https://uniapp.dcloud.io/api/request/request
如果希望返回一个 requestTask 对象,需要至少传入 success / fail / complete 参数中的一个。
如果没有传入 success / fail / complete 参数,则会返回封装后的 Promise 对象
预期结果
Promise 返回对象在 Typescript 中有正确的类型
实际结果
现有类型无法通过 Typescript 类型检查, 后续代码全部 Typescript 类型报错
系统信息:
系统无关问题
4条答案
按热度按时间zd287kbt1#
#561 也提到了这个问题,官方还未统一处理返回Promise的情况,需要开发者自行处理。
不过我要指出来一下,那个issue的作者提出的solution并没有达到type check的目的。
declare namespace UniApp {}
内部,所以request的这个overload是识别不到的。declare namespace UniApp {}
内部,我的方法调用还是没被识别为期望的那个overload。src/typings/index.d.ts
:这里返回的Promise的类型参数是个tuple,因为根据 文档 ,Promise返回形式返回的是一个数组,数组第一项为错误信息,第二项为返回数据。
调用代码:
该调用的返回值依然被判定为
UniApp.RequestTask
。我觉得原因是uni-app的那个UniApp.Uni.request()
的参数RequestOptions
中,success
,fail
,complete
这三个参数本来就是optional的,即使把它们omit掉创造一个新类型RequestOptionsWithoutCallback
,跟RequestOptions
也没有区别。我现在的解决方式是再封装一下request方法:
1dkrff032#
我也遇到了,暂时用这几行代码搞定,暂时全函数都支持
b91juud33#
似乎Uni官方的Promise响应不大一样,还得改改就好
xv8emn3q4#
这样