You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改第三方库声明文件中的any类型?

问题描述

我使用的某个第三方库的声明文件index.d.ts中包含如下内容:

declare namespace browser.runtime
{
    ...
    function sendMessage(message: any, options?: _SendMessageOptions): Promise<any>;
    function sendMessage(extensionId: string, message: any, options?: _SendMessageOptions): Promise<any>;
    ...
}

我希望替换其中的any类型,而非仅添加重载(添加重载无法满足需求,比如以下写法无法覆盖原有any类型的声明):

declare namespace browser.runtime
{
    function sendMessage(message: any, options?: _SendMessageOptions): Promise<unknown>;
}

请问有没有办法移除或替换原有声明?

解决方案
  • 创建全局类型补丁文件(推荐)
    在项目中新建一个.d.ts类型文件(例如browser-runtime-override.d.ts),利用TypeScript的命名空间合并特性完全覆盖原有方法声明:

    declare namespace browser.runtime {
      // 自定义泛型类型,替换原有any
      function sendMessage<TMessage = unknown, TResponse = unknown>(
        message: TMessage,
        options?: _SendMessageOptions
      ): Promise<TResponse>;
      function sendMessage<TMessage = unknown, TResponse = unknown>(
        extensionId: string,
        message: TMessage,
        options?: _SendMessageOptions
      ): Promise<TResponse>;
    }
    

    确保该文件被TypeScript识别:将其路径添加到tsconfig.json的include数组中。TypeScript会优先使用你定义的重载,完全覆盖原有any类型的声明。

  • 直接修改第三方库声明文件(不推荐)
    找到项目node_modules目录下对应库的index.d.ts,定位到browser.runtime.sendMessage的声明,直接将any替换为你需要的类型(如unknown或自定义业务类型)。但这种方式的弊端是,库更新后修改会被覆盖,需要重复操作。

  • 局部类型断言(临时方案)
    如果仅需在单个调用场景修正类型,可以使用类型断言:

    // 替换为你的自定义消息和响应类型
    type MyMessage = { type: string; data: any };
    type MyResponse = { code: number; result: any };
    
    const response = await browser.runtime.sendMessage(
      myMessage
    ) as Promise<MyResponse>;
    

    此方法仅针对局部调用生效,无法全局替换声明。

内容的提问来源于stack exchange,提问作者Sonny D

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 07:38:30