TypeScript模块系统
模块是指在其自身作用域里执行,而不是在全局作用域里;模块间是依靠 export 和 import 建立关系。编译器在编译过程中,也是依赖这种关系来定位需要编译的文件。
TypeScript 依然还是以 JavaScript 文件的形式发布类库,这会导致类型无法表述,需要配合声明文件对其进行类型描述;因此声明文件成了类库一个必不可少的组成部分。
分类
有声明文件
要分清类库是否有声明文件 *.d.ts
类库自带
从 Npm 安装一个依赖包后,可以直接检查该依赖包库的 package.json 是否包含 typings 节点,该节点对应的文件就是声明文件。
TypeSearch检索
TypeScript 提供了一个叫 TypeSearch 网站,可以直接输入关键词检查是否包含该类库的声明文件。
无声明文件
Angular Cli 创建的项目会包含一个 src/typings.d.ts 声明文件,它会自动包含在全局声明定义中,而把这些类库的声明信息写在这里面再好不过。
一般而言自己很难对一个类库写一个完整的声明文件,这对于成本来说太不合算,因此往往都是只对部分全局对象做一个 any (表示忽略该静态类型检查)亦可,例如:
1 | declare const XLSX: any |
如何使用?
有声明文件
对于有声明文件,无需额外做什么,只需在需要模块的地方使用 import 来导入即可。
无声明文件
使用 any 来表示忽略静态类型检查,意味者无法享受声明文件带来的智能提示快感,可以在项目的任意位置直接使用它,但也仅仅只能识别声明的变量,而实例的方法或属性是不可知的。
除此之外 TypeScript 编译过程中也不会对 G2 做任何类型检查,G2 是否真的存在只能由自己把握。对于 Angular 而言,是需要额外在 angular.json 的 scripts 节点上明确加载这些模块。