Skip to content

TypeScript 模块申明

对于 TypeScript 的模块什么我们先要了解两个概念。

模块(module)

主要是解决加载依赖关系的,侧重代码的复用。跟文件绑定在一起,一个文件就是一个 module,模块写法和 ES6 一样。 所以其主要用于 import 的时候使用

ts

// a.d.ts
declare module a {
  get ( param : string) : string
}

import * as a from "a";
a.get() // 就可以使用了

命名空间(namespace)

同 Java 的包、.Net 的命名空间一样,TypeScript 的命名空间将代码包裹起来,通过 export 关键字对外暴露需要在外部访问的对象。 主要用于组织代码,解决命名冲突,会在全局生成一个对象,定义在 namespace 内部的都要通过这个对象的属性访问。 随着 ES6 的广泛应用,现已经不建议使用 ts 中的 namespace,而推荐使用 ES6 模块化方案,但在声明文件中,declare namespace 还是比较常用的。 namespace 声明可以用来添加新类型,值和命名空间,只要不出现冲突。 与 class/namespace 等类型合并

ts
// b.d.ts
declare namespace b {
  get ( param : string) : string
}

// import * as a from "a";  不需要引入b.d.ts
b.get() // b 可以全局使用

主要关注下面几个表达式 declare 、 namespace 、 module

  • declare 申明一个变量、命名空间、模块等
ts
declare var str: string
declare function func(): any
declare namespace jQuery {
  function ajax<T>(): Promise<T>
}
declare module a {
  get ( param : string) : string
}

export 和 import

如果当我们申明一个命名空间的时候出现了 import 或者 export 那么这个命名空间就不会当做全局命名空间了

ts
import { People } from "../merge-function/merge"

declare namespace a {
  function call1(who: People): void
}

// a.call1 就不能访问

那么我们怎么解决

正确

ts
declare namespace a {
  import { People } from "../merge-function/merge"
  function call1(who: People): void
}

// a.call1 就可以访问