1 minute read

Symbols 是不可改变且唯一的。

let sym1 = Symbol()

let sym2 = Symbol("key") // 可选的字符串key

sym1 === sym2 // false symbols 是唯一的

// 作为对象的属性
let obj = {
    [sym1]: "value",
}

obj[sym1] // 'value'

// 再类中使用
class C {
    [sym2]() {
        return "C"
    }
}
let c = new C()
c[sym2]() // 'C'

模块

“内部模块”现在称做“命名空间”。 “外部模块”现在则简称为“模块”, module X { 相当于现在推荐的写法 namespace X {

模块是自声明的;两个模块之间的关系是通过在文件级别上使用 imports 和 exports 建立的。

模块使用模块加载器去导入其它的模块。 在运行时,模块加载器的作用是在执行此模块代码前去查找并执行这个模块的所有依赖。 大家最熟知的 JavaScript 模块加载器是服务于 Node.js 的 CommonJS 和服务于 Web 应用的Require.js

导出

任何声明(比如变量,函数,类,类型别名或接口)都能够通过添加export关键字来导出。

export interface StringValidator {
    isAcceptable(s: string): boolean;
}

// 导出重命名
export { StringValidator as mainValidator }

// 导出原先的验证器但做了重命名
export { ZipCodeValidator as RegExpBasedZipCodeValidator } from "./ZipCodeValidator"

默认导出

每个模块都可以有一个default导出。 默认导出使用 default关键字标记;并且一个模块只能够有一个default导出。 需要使用一种特殊的导入形式来导入 default导出。

导入

// 导入一个模块中的某个导出内容
import { ZipCodeValidator } from "./ZipCodeValidator"

// 可以对导入内容重命名
import { ZipCodeValidator as ZCV } from "./ZipCodeValidator"
let myValidator = new ZCV()

// 将整个模块导入到一个变量,并通过它来访问模块的导出部分
import * as validator from "./ZipCodeValidator"
let myValidator = new validator.ZipCodeValidator()

export =

export =语法定义一个模块的导出对象。 这里的对象一词指的是类,接口,命名空间,函数或枚举。 若使用export =导出一个模块,则必须使用 TypeScript 的特定语法import module = require("module")来导入此模块

 interface stringValidator {
    isAcceptable(s: string): boolean
}
// export default '123'

const s: stringValidator = {
    isAcceptable(s: string): boolean {
        return true
    }
}
// export default s

export = stringValidator

在同一个文件中如果要是用export = 则不能有别的 export 语句,不然会报错的。

可以通过不同的指令来实现,根据不同的方式来编译,是根据 commonJs 还是 requireJs 等来

tsc --module commonjs Test.ts  // 对于Node.js来说,使用--module commonjs;
tsc --module amd Test.ts // 对于Require.js来说,使用--module amd.

Updated: