跳到主要内容

声明合并

Merging Interfaces

interface A {
name: string;
}

interface A {
age: number;
}

let a: A = {
name: 'aaa',
age: 20
}
class D {
name = 'ddd'

run() {

}
}

interface D {
age: number;
}

let d: D = {
name: 'ddd',
run() {},
age: 20,
}

Merging Namespaces

namespace B {
export interface C {
name: string;
}
export const name = 10;
}

namespace B {
export interface C {
age: number;
}
export const age = 20;
}

let c: B.C = {
name: 'ccc',
age: 20
}

let c2 = B.age
let c3 = B.name;

Merging Namespaces With Value

我们知道像变量函数只能在值上下文中使用,interfacetype alias只能在类型上下文中使用,而classenum既可以在值上下文中使用也可以在类型上下文中使用。

namespace则更加特殊,这个关键字原本在TypeScript中代表的含义是内部模块(internal module),主要的作用是将相关的类型和值挂载在一个对象上,事实上在编译后我们能够得到的就是一个对象。

namespace Obj {
export const age = 20;
}

// --- 等价于 ---

const Obj = {
age: 20
}

因此我们可以使用namespace来给ClassesFunctionsEnums合并静态的属性或方法(后者本质上都是对象)

function fn() {

}

namespace fn {
export const age = 20;
}

console.log(fn.age);
enum Color {
One,
Two,
}

namespace Color {
export const age = 20;
}

console.log(Color.One, Color.Two, Color[0], Color[1], Color.age)