TypeScript 1.5后为了与ECMAScript2015保持一致。 “内部模块”现在称做“命名空间”。 “外部模块”现在则简称为“模块”
模块
定义
模块类似一个私有类,在其自身的作用域里执行,而不是在全局作用域里
用export进行导出,在使用的地方用import进行导入
侧重于代码复用, 一个模块可以有多个命名空间
只有包含顶级import或者export的文件才会视为模块, 否则内容全局可见
导出
导出声明
任何声明(比如变量,函数,类,类型别名或接口)都能够通过添加export关键字来导出。
export interface exportInterface { /*...*/ }
export const exportNum = 123;
export class exportClass implements exportInterface { /*...*/ }
导出语句
同时也可以先声明之后使用导出语句再导出
class exportClass { /*...*/ }
const exportNum: number = 123;
// 使用导出语句简化导出, 同时也可以使用as重命名
export { exportClass as ClassA, exportNum };
重新导出
也可以在其他文件对另一个文件的内容重新进行导出, 也可以同时修改名称
// 重新在另一个文件导出上一个文件的ClassA,并更换名称
export {ClassA as ClassB} from "./ClassA";
默认导出
每个模块都可以有一个default导出。 默认导出使用 default关键字标记
该导出在导入时不需要按照名称导入, 可以直接设定名称,无需as
export default "123";
对于默认导出,则导入时不需要{}, 并且在导入时就赋予了名称
import num from "./number";
console.log(num); // "123"
导入
正常导入
import { ClassA } from "./ClassA";
import { ClassA as ClassB } from "./ClassA"; // 同时可以进行重命名
全导入
对一个模块的导出进行整体导入
import * as AllClass from "./ClassA";
const a = new AllClass.ClassA()
命名空间
内部模块,主要用于组织代码,避免命名冲突
namespace A {
export class Person {
name: string // 属性
constructor(n: string) { // 构造函数,实例化触发方法
this.name = n
}
getName(): string {
return this.name
}
setName(name: string): void {
this.name = name
}
}
}
// B中名称和A中可以相同
namespace B {
export class Person {
name: string // 属性
constructor(n: string) { // 构造函数,实例化触发方法
this.name = n
}
getName(): string {
return this.name
}
setName(name: string): void {
this.name = name
}
}
}
// 声明 需要命名空间中使用export进行导出
var a = new A.Person('ZFLin')
var b = new B.Person('ZFLin')
当然也支持多文件的相同名称的命名空间
// name.js
namespace Person {
export const name: string = 'ZFLin'
}
// age.js
namespace Person {
export const age: number = 18
}
// main.js
console.log(Person.age) // 18
console.log(Person.name) // ZFLin
对于多层嵌套的命名空间,使用import q = x.y.z给常用的对象起一个短的名字
namespace A {
export namespace B { export class ClassC { } }
}
import b = A.B;
let c = new b.ClassC(); // 与 "new A.B.ClassC()"相同