declare module 是 TypeScript 中用于扩展现有模块的特性。它允许开发者在已有模块的基础上,添加新的功能(比如扩展接口、添加类型声明等)。通过 declare module,可以将额外的声明合并到原模块中。以下是用法详解:
用法场景
1、为已有模块添加功能
当你使用一个模块(如 “./Test”),但是该模块的类型声明文件不包含你需要的功能时,可以通过 declare module 来为其扩展。
2、非侵入式扩展
你可以在不修改原模块源码的情况下,通过声明合并扩展它的功能
3、解决类型定义缺失问题
如果模块没有提供完整的类型声明,或者你需要自定义一些扩展,可以使用 declare module
示例详解
假设你有一个 ./Test 模块,其中导出了一个 Test 类或接口,但没有包含某些方法或属性:
原始模块内容(./Test.ts)
export interface Test {
name: string;
}
扩展模块内容
declare module "./Test" {
interface Test {
zoomLevel?: number; // 添加一个可选属性
setZoomLevel?(level: number): void; // 添加一个方法
}
}
扩展后的效果
扩展后,Test 接口将合并新增的属性和方法:
import { Test } from "./Test";
const myTest: Test = {
name: "City Test",
zoomLevel: 10,
setZoomLevel(level: number) {
console.log(`Zoom level set to ${level}`);
}
};
myTest.setZoomLevel?.(15); // 使用扩展的方法
注意事项
1、必须与模块路径匹配
declare module “./Test” 中的路径必须与实际模块路径一致,否则扩展无效。
2、不能声明不存在的模块
如果模块 “./Test” 根本不存在,编译会报错。可以通过 declare module “*.moduleName” 声明未知模块。
3、类型合并
TypeScript 会将 declare module 的内容与原模块声明合并,而不是覆盖,因此原有功能仍然可用。
4、避免重复声明
如果同一模块被多次扩展,可能导致声明冲突,需确保每次扩展的内容是独立的