d.ts 中如何覆盖全局类型?

发布于 2022-09-12 13:33:00 字数 1321 浏览 28 评论 0

在uni-app使用ts开发中,uni-app的promise类型返回值是错误的,我将这个错误纠正后形成一个新的类型,但我却无法覆盖 declare const uni: UniApp.Uni;的类型,我应该如何覆盖全局模块定义的类型?

这个是我定义正确的uniPromiseApi返回的类型

// types/uni.d.ts 解决uni, promise返回值不正确
type Empty = null | undefined | void | never;
type IfElse<T, D> = T extends Empty ? D : T;
type Else<T, D> = T extends Empty ? never : D;
type NonNullable<T> = T extends Empty ? never : T;
type PromiseUni<T = UniApp.Uni> = {
  [P in keyof T]: (
    ...args: Parameters<T[P]>
  ) => IfElse<
    ReturnType<T[P]>,
    Else<
      Parameters<Parameters<T[P]>[0]['success']>[0],
      Promise<
        [
          Parameters<Parameters<T[P]>[0]['fail']>[0],
          Parameters<Parameters<T[P]>[0]['success']>[0]
        ]
      >
    >
  >;
};

然后无论我怎么定义,都不能覆盖 uni 的类型

// 没有效果
declare module '@dcloudio/types' {
  declare const uni: PromiseUni;
}
// 没有效果
declare module '@dcloudio/types/uni' {
  declare const uni: PromiseUni;
}
// 没有效果
declare const uni: PromiseUni;

image.png

目前只能使用 as 断言方式解决问题,有木有更好的方法?
image.png

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

若水微香 2022-09-19 13:33:00

类似这样,比如往vue中添加一个全局方法,

import Vue from 'vue'

// 扩展Vue原型
declare module 'vue/types/vue' {
  interface Vue {
    $url(url: string): string;
  }
}

比如给axios添加一个code、msg检验,

import { AxiosResponse } from 'axios'

// 扩展响应数据
declare module 'axios' {
  interface AxiosResponse {
    code: number;
    msg: string;
  }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文