typescript 如何重写、拓展三方库定义的常量对象属性类型?

项目里引用了一个三方UI组件库。
里面关于消息提示框 api 的 typescript 定义:

declare const Message: {
  info(content: string): void;
};
export default Message;

这样就规定了使用 message.info(content) 时的传参类型。

现在我想重新定义下 message.info() 引用,在使用 message.info 时能多传一个参数 duration,比如 message.info('这是弹窗文本', 300)
希望 typescript 定义的 message.info 为这样

message.info(content: string, duration?: number);

请教下各位大佬们,这种情况如何在自己项目的 .d.ts 文件里重写或者拓展三方组件库的定义,比如:

declare module 'ant-design-vue/es/*' {
  import type { message } from 'ant-design-vue/es/';

  const Message: {
    info(content: string, duration?: number): void;
  }

  export default message
}
回复
阅读 801
3 个回答
新手上路,请多包涵
type Message= {
  info(content: string): void;
};
type Messaged = Omit<Message,"info">&{
  info(content: {name:string}): void;
}
const message: Messaged={
  info(content){
    return content.name
  }
}

image.png


注:不知道你用的哪个版本的 ant-design-vue,反正我装的最新的 message.info() 有三个参数,其中后两个都是可省略的。

你这个想法有问题。你得这么理解:

为什么需要类型定义?或者函数签名?

因为这样在开发阶段就可以凭借类型推导提前找到代码中的错误,提升代码质量,降低测试成本。

所以一个第三方函数,它支持哪些参数、提供哪些返回都是固定的,你不可能修改它的描述文件让它适配更多的功能。

正确的做法是:

  1. 你写一个自己的 Message.info() 函数,增加 duration 参数
  2. 然后在开发中使用自己的函数
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题