TypeScript学习日记-模块与命名空间

318 阅读2分钟

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()"相同