如何扩展而非覆盖TypeScript现有类型声明?含接口重载添加
这个问题我之前也碰到过,TypeScript的
声明合并
特性就是解决这类本地临时扩展类型的核心!你不需要重新定义整个
CodeMirror
命名空间,只需要针对性扩展你需要的接口即可,具体步骤如下:
1. 创建本地类型声明文件 #
在你的项目里新建一个
.d.ts
类型声明文件,比如命名为
codemirror-extensions.d.ts
(名字随意,只要后缀是
.d.ts
就行),建议放在项目根目录或者
src/types
目录下。
2. 针对性扩展目标接口 #
在这个文件里,只需要声明你要扩展的
CodeMirror
子接口,TypeScript会自动把你的声明和
@types/codemirror
里的原有声明合并,不会覆盖整个命名空间。举个具体例子:
假设你要给
CodeMirror.Editor
接口的
setOption
方法添加一个新的重载,就这么写:
declare namespace CodeMirror { interface Editor { // 新增的函数重载:支持名为"customHighlight"的选项,值为布尔类型 setOption(option: "customHighlight", value: boolean): void; // 如果还要扩展getOption的重载,也可以加在这里 getOption(option: "customHighlight"): boolean;
如果是要给全局的
CodeMirror
函数本身加重载,比如新增一个初始化参数的重载,写法类似:
declare namespace CodeMirror { // 扩展CodeMirror的初始化函数重载 function fromTextArea(textarea: HTMLTextAreaElement, options: { newCustomOption: string }): Editor;
3. 确保声明文件被TypeScript识别 #
检查你的
tsconfig.json
,确保
include
数组包含了这个声明文件的路径。比如如果文件在项目根目录,
include
可以这么写:
{
"compilerOptions": {
// 你的原有配置
"target": "es5",
"module": "none"
"include": [