Appearance
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 就可以访问