Declaration Merging with TypeScript
原文:https://blog.oio.de/2014/03/21/declaration-merging-typescript/
Why might you need this?
There can be several scenarios where this might be required. One of the most common ones is when you want to extend an existing JavaScript library that comes with a type definition.
---------------------------------------------------
Declaration Merging with TypeScript
Declaration merging is a very interesting feature of TypeScript, the statically typed superset of JavaScript.
As you will see, different things can be merged in TypeScript.
The merging is always based on matching names, so as soon as two e.g. interfaces have the same name (and live in the same namespace), they will get merged.
What can be merged in TypeScript?
In TypeScript it is possible two merge
– mutliple interfaces
– multiple modules
– modules with classes
– modules with functions
– modules with enums
Merging multiple interfaces
To merge multiple interfaces, simply give them the same name.
1
2
3
4
5
6
7
8
|
interface Foo { doIt(); } interface Foo { doSomething(); doSomethingDifferent(); } |
This will result in a merged interface as follows.
1
2
3
4
5
|
interface Foo { doSomething(); doSomethingDifferent(); doIt(); } |
As you can see, the two interfaces are merged in reverse order, but the order of the declarations in each individual interface is not changed.
A reverse merge order is important if you want to extend a library.
Merging multiple modules
Modules with the same name will merge their members, effectively creating a common namespace.
1
2
3
4
5
6
7
|
module mod { export class Foo { } } module mod { export class Bar extends Foo { } } |
Merging modules is a common task if you use internal modules with TypeScript. It enables you two use the one class per file best practice while placing multiple classes inside the same namespace.
If you have a Java background, merging modules can be compared to putting multiple classes inside the same package.
Merging modules with classes, functions and enums
You can merge modules with classes, functions and enums. This might sound strange, but it allows you to extend these constructs with additional properties in a typesafe way.
Here is an example on how to extend a function with properties, which is a common practice in the JavaScript world:
1
2
3
4
5
6
7
|
function greet() { console.log( "Hello " + greet.target); } module greet { export var target = "World" ; } |
Here is another example that extends an enum with a method:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
enum UserType { ADMIN, USER, GUEST } module UserType { export function parse(value: string): UserType { var UT: any = UserType; if ( typeof UserType[value] === "undefined" ) { throw new Error( "unknown value of enum UserType: " + value); } return UserType[value]; } } |
As you can see in another blog post, merging a class with a module containing another class can be used to create inner classes.
What cannot be merged in TypeScript?
In the current TypeScript version (1.0RC at the time of writing), it is not possible to merge the following:
– multiple classes
– classes with variables
– classes with interfaces
This may change in future TypeScript versions.
Mixins could be an alternative approach for these things.
For additional information, take a look at the wiki page at Codeplex.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
2016-11-08 php 命名空间
2016-11-08 好的习惯