uni-app uni.request promise 版无 Typescript 返回类型

oipij1gg  于 2022-11-02  发布在  uni-app
关注(0)|答案(4)|浏览(669)

问题描述

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 类型报错

系统信息:

系统无关问题

zd287kbt

zd287kbt1#

#561 也提到了这个问题,官方还未统一处理返回Promise的情况,需要开发者自行处理。

不过我要指出来一下,那个issue的作者提出的solution并没有达到type check的目的。

type ApiOption = Omit<Partial<RequestOptions>, "success" | "fail" | "complete">;

interface Uni {
    request(options: ApiOption): Promise<any>;
}
  • 首先类型声明并没有放到 declare namespace UniApp {} 内部,所以request的这个overload是识别不到的。
  • 其次,即使放到 declare namespace UniApp {} 内部,我的方法调用还是没被识别为期望的那个overload。

src/typings/index.d.ts :

declare namespace UniApp {
    type RequestOptionsWithoutCallback = Omit<RequestOptions, 'success' | 'fail' | 'complete'>;

    interface Uni {
        request(options: RequestOptionsWithoutCallback): Promise<[any, any]>;
    }
}

这里返回的Promise的类型参数是个tuple,因为根据 文档 ,Promise返回形式返回的是一个数组,数组第一项为错误信息,第二项为返回数据。

调用代码:

uni.request({ url: '/some/api' });

该调用的返回值依然被判定为 UniApp.RequestTask 。我觉得原因是uni-app的那个 UniApp.Uni.request() 的参数 RequestOptions 中, success , fail , complete 这三个参数本来就是optional的,即使把它们omit掉创造一个新类型 RequestOptionsWithoutCallback ,跟 RequestOptions 也没有区别。

我现在的解决方式是再封装一下request方法:

type RequestOptionsWithoutCallback = Omit<UniApp.RequestOptions, 'success' | 'fail' | 'complete'>;

function request(options: RequestOptionsWithoutCallback) {
    return new Promise<UniApp.RequestSuccessCallbackResult>((resolve, reject) => {
        uni.request({
            ...options,
            success: (result: UniApp.RequestSuccessCallbackResult) => resolve(result),
            fail: (result: UniApp.GeneralCallbackResult) => {
                console.error(result);
                reject(result);
            },
        });
    });
}
1dkrff03

1dkrff032#

我也遇到了,暂时用这几行代码搞定,暂时全函数都支持

b91juud3

b91juud33#

似乎Uni官方的Promise响应不大一样,还得改改就好

相关问题