如何修改第三方库声明文件中的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
相关产品推荐
相关产品推荐

