TypeScript Declaration Merging(声明合并)使用说明

news/2025/10/10 16:16:44/文章来源:https://www.cnblogs.com/LearnerPing/p/19133282

最近在进行前端开发的时候,为了拓展引用,使用了TS声明合并的特性,完整的了解了一下该特性,特此记录成笔记。

声明合并指在TypeScript里面,编译器将两个或者多个独立的相同名称的声明合并到一起。合并后的定义同时包含所有声明。可以理解为声明的拓展

接口合并

最常见的合并就是接口合并,接口合并后的成员会整合到一起。

  • 接口中的非函数成员应该是唯一的,如果不是唯一,那他们必须有相同的类型,如果声明了两个同名但是类型不通的非函数成员会报错
  • 对于函数成员而言,每一个同名函数成员都相当于当前函数成员的一个版本,第一个接口A和第二个接口A合并的时候,第二个接口声明对象的优先级会高于第一个

eg:

interface Cloner {clone(animal: Animal): Animal;
}
interface Cloner {clone(animal: Sheep): Sheep;
}
interface Cloner {clone(animal: Dog): Dog;clone(animal: Cat): Cat;
}

合并后:

interface Cloner {clone(animal: Dog): Dog;clone(animal: Cat): Cat;clone(animal: Sheep): Sheep;clone(animal: Animal): Animal;
}
  • 当函数参数是单个字符串字面量类型时,合并后将被“提升”至重载列表顶部

eg:

interface Document {createElement(tagName: any): Element;
}
interface Document {createElement(tagName: "div"): HTMLDivElement;createElement(tagName: "span"): HTMLSpanElement;
}
interface Document {createElement(tagName: string): HTMLElement;createElement(tagName: "canvas"): HTMLCanvasElement;
}

合并后:

interface Document {createElement(tagName: "canvas"): HTMLCanvasElement;createElement(tagName: "div"): HTMLDivElement;createElement(tagName: "span"): HTMLSpanElement;createElement(tagName: string): HTMLElement;createElement(tagName: any): Element;
}

合并命名控件

和接口合并类似,合并命名空间的时候也会合并其成员

  • 合并命名空间的时候,每个命名空间中声明的导出接口的类型定义会自行进行合并,从而形成一个包含合并后的接口定义的单一命名空间。未导出的类型不会合并

eg:

namespace Animals {export class Zebra {}
}
namespace Animals {export interface Legged {numberOfLegs: number;}export class Dog {}
}

合并后:

namespace Animals {export interface Legged {numberOfLegs: number;}export class Zebra {}export class Dog {}
}

模块扩充

虽然 JavaScript 模块不支持合并操作,但可以通过导入并更新现有对象来对其进行修补,在使用第三方框架,框架引用了其他组件,但是第三方框架没有提供该组件足够的属性的时候,可以使用这种方式来拓展来避免更新整个框架。

eg:

// observable.ts
export class Observable<T> {// ... implementation left as an exercise for the reader ...
}
// map.ts
import { Observable } from "./observable";
declare module "./observable" {interface Observable<T> {map<U>(f: (x: T) => U): Observable<U>;}
}
Observable.prototype.map = function (f) {// ... another exercise for the reader
};
// consumer.ts
//通过拓展合并来使用户来调用Observable的map方法
import { Observable } from "./observable";
import "./map";
let o: Observable<number>;
o.map((x) => x.toFixed());

eg2;
原本的框架里面,对

export declare const Table: {tooltipOptions: import("vue").PropType<Partial<Pick<import("element-plus").ElTooltipProps, "showArrow" | "appendTo" | "transition" | "effect" | "enterable" | "popperClass" | "offset" | "placement" | "popperOptions" | "showAfter" | "hideAfter">>>;}
export default Table;
export type {TableProps}

这里Table是某框架封装的属性,使用了的element-plus组件,并提供了tooltipOptions部分属性,但是这里是不够的,实际使用的时候期望可以使用全部属性,又不想升级框架,这里就可以声明命名空间来进行拓展。

// src/types/pure-table.d.ts
import "element-plus";
import "/table";// 声明合并 TableProps
declare module "/table" {// 这里扩展 PureTableProps 的定义interface PureTableProps {// 扩展 tooltipOptions 支持完整的 ElTooltipPropstooltipOptions?: Partial<import("element-plus").ElTooltipProps>;}
}

合并之后,在使用Tabel组件的时候,其提供的tooltipOptions属性将支持完整的ElTooltipProps

命名空间与类、函数、枚举合并

目前Ts支持命名空间与其他类型的合并,需要注意的是类与类之间的合并是不允许的

命名空间和类

class Album {label: Album.AlbumLabel;
}
namespace Album {export class AlbumLabel {}
}

此时Album.label是合法的调用

命名空间和函数

function buildLabel(name: string): string {return buildLabel.prefix + name + buildLabel.suffix;
}
namespace buildLabel {export let suffix = "";export let prefix = "Hello, ";
}
console.log(buildLabel("Sam Smith"));

命名空间和枚举

enum Color {red = 1,green = 2,blue = 4,
}
namespace Color {export function mixColor(colorName: string) {if (colorName == "yellow") {return Color.red + Color.green;} else if (colorName == "white") {return Color.red + Color.green + Color.blue;} else if (colorName == "magenta") {return Color.red + Color.blue;} else if (colorName == "cyan") {return Color.green + Color.blue;}}
}

More info: Learnerping的个人微博

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/934215.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第七章 手写数字识别V5

# 优化: # 新建Model类,将神经网络的结构定义、训练流程(前向/后向)和预测逻辑统一封装起来 # 何将权重更新的职责从网络层(Linear)中分离出来,交给优化器(SGD)来完成 # 使用动量梯度下降优化算法(MSGD) # …

关于根据距离列表排序sql

关于根据距离列表排序sql//第一种 根据经纬度排序 $map = "1=1 ";if ($loadCode && $unloadCode) {$map .= " AND load_city_id = $loadCode and unload_city_id = $unloadCode";}…

2025年高适配铝型材厂家推荐:深圳市方达铝业领衔,3家企业覆盖多场景

随着科技的进步与工业的发展,铝型材作为一种轻质、高强度且耐腐蚀的材料,广泛应用于 3C 数码、智能家居、工业设备等多个领域。然而,市场上铝型材厂家众多,产品质量与服务水平参差不齐,给消费者的选择带来了困扰。…

注册c模块到lua中使用

#define REGISTER_CUSTOM_LIBRARY(name, lua_c_fn) \ int lua_c_fn(lua_State*); \ luaL_requiref(L, name, lua_c_fn, 0); \ lua_pop(L, 1) /* remove lib */ //注册c模块void open_custom_libs(lua_State* …

S3Bucket安全评分与合规状态逻辑修复:全面提升云存储安全评估准确性 - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

DNA权威书籍

《基因XII》- 本杰明卢因分子生物学“圣经”。 这是全球最经典、最权威的分子生物学教材,每隔几年就会更新一版。内容极其全面、系统,从DNA结构、复制、转录、翻译到基因调控、基因组学、新技术都有详尽的阐述。插图…

220V转5V500mA非隔离电源芯片WT5105

220V转5V500mA非隔离电源芯片WT5105 WT5105 是一款集成非隔离式电源控制器,可将 220V 电压转换为 5V、500mA 的稳定输出,为低功率设备提供稳定、高效的供电解决方案。以下是其相关介绍:核心参数:输出电压为 5V,输…

linux基础-find查找

linux基础-find查找 1.认识 实时查找工具,通过便利指定路径完成文件的查找工作特点:(1)精确查找(2)实时查找(3)查找速度慢(4)可能之搜索用户具备读取和执行权限的目录语法 :   find [OPTION]... [查找路径…

220V转12V电机水泵供电驱动WT5105

220V转12V电机水泵供电驱动WT5105 WT5105是一款AC-DC开关电源驱动芯片,适用于220V转12V的电机水泵应用。以下是详细介绍:基本参数输入电压:85V~265V AC(覆盖220V市电)输出电压:可调,支持12V输出输出功率:5V-15…

ansys安装时无法修改安装路径--灰色无法修改

ansys安装时无法修改安装路径,是因为有ansys程序运行、曾经安装没有卸载干净 1、卸载 2、清除注册表(工具) 3、参考官方方法 Uninstalling the Ansys license manager – Ansys Optics以下是官网卸载方法 Uninstall…

Qwen2.5-VL技术报告

原文:https://mp.weixin.qq.com/s/IbfY50w_w27WO3ZzRSsyDg 全文摘要Qwen2.5-VL模型在视觉语言系列中具有显著的基础能力和创新功能上的提升。通过增强的视觉识别、精确的对象定位、稳健的文档解析和长视频理解等能力,…

智能提取表格从pdf, 图片 到 excel, csv

智能提取表格从pdf, 图片 到 excel, csvhttps://www.textin.com/

攸米知识付费小程序管理系统:一站式知识变现解决方案

在数字化浪潮推动下,知识付费成为教育、培训及内容创作领域的重要变现模式。攸米知识付费小程序系统依托微擎生态,为用户提供微信小程序端知识付费平台搭建服务,涵盖课程管理、会员体系、营销工具、订单处理等全流程…

citus设置密码

给citus集权设置密码 用户名: luozhengkang 密码:xiaoluo 数据库:mdmaster_prod-- 创建用户 CREATE USER luozhengkang WITH PASSWORD xiaoluo NOSUPERUSER NOCREATEDB NOCREATEROLE INHERIT LOGIN CONNECTION LIMIT…

实践与认识及其发展规律

摆脱贫困首要并不是摆脱物质的贫困,而是摆脱意识和思路的贫困 告诉我们 实践主体的能力即包括自然能力,也包括精神能力 实践主体:指具有一定的主体能力,从事现实社会实践活动的人 实践主体的能力:包括自然能力和精…

2025 年最新推荐氨糖厂家排行榜:四期临床验证 + 蓝帽认证,帮你选出优质氨糖软骨素 / 氨糖钙 / 氨糖钙片厂家

当前,人口老龄化加剧使中老年群体对骨健康重视度飙升,氨糖作为关节健康守护关键成分,市场需求急剧增加。然而,氨糖市场乱象丛生,大量品牌缺乏核心研发能力,产品配方同质化严重,无法满足不同人群个性化骨健康需求…

完整教程:阿里云瓴羊发布企业级AI智能体服务平台AgentOne,成就AI时代的“超级公司”

完整教程:阿里云瓴羊发布企业级AI智能体服务平台AgentOne,成就AI时代的“超级公司”pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; …

利用MCP Server革新软件测试:更智能、更高效的自动化

在当今快速迭代的软件开发环境中,传统测试方法正面临前所未有的挑战。本文将介绍如何借助MCP Server这一创新技术,彻底改变软件测试的工作流程,实现更智能、更高效的自动化测试。 为什么测试需要MCP Server? 传统自…

数据结构-设计一个算法删除单链表L(有头节点)中的最小结点。

数据结构 设计一个算法删除单链表L(有头节点)中的最小结点。 /**************************************************************************** * @name LkListDelMin* @brief 删除单链表中的最小结点* @pa…