7、TypeScript的模块系统和命名空间
模块导出与导入
导出
1 | let a1 = 100 |
没有默认导出
如果一个模块没有默认导出
1 | // m1.ts |
则在引入该模块的时候,需要使用下列一些方式来导入
1 | // main.ts |
导入
1 | import { a1, hello } from './a' |
模块编译
TypeScript
编译器也能够根据相应的编译参数,把代码编译成指定的模块系统使用的代码
module
选项
在 TypeScript
编译选项中,module
选项是用来指定生成哪个模块系统的代码,可设置的值有:"none"
、"commonjs"
、"amd"
、"udm"
、"es6"
/"es2015/esnext"
、"System"
target=="es3" or "es5"
:默认使用commonjs
- 其它情况,默认
es6
加载非 TS
文件
有的时候,我们需要引入一些 js
的模块,比如导入一些第三方的使用 js
而非 ts
编写的模块,默认情况下 tsc
是不对非 ts
模块文件进行处理的
我们可以通过 allowJs
选项开启该特性
1 | // m1.js |
非 ESM
模块中的默认值问题
如果在js文件中导出的模块没有默认导出,那么在ts中加载需要在编译配置中打开allowSyntheticDefaultImports
选项。
虽然可以编译通过,但生成的文件会默认调用default
属性,因此打印出的结果是undefined
,因此为了处理默认值问题,还需要打开esModuleInterop
选项。
因此,如果处理非默认导出模块需要开启三个选项:
1 | { |
注意:以上设置只能当
module
不为es6+
的情况下有效
以模块的方式加载 JSON 格式的文件
TypeScript 2.9+
版本添加了一个新的编译选项:resolveJsonModule
,它允许我们把一个 JSON
文件作为模块进行加载
resolveJsonModule
设置为:true
,可以把 json
文件作为一个模块进行解析
data.json
1 | { |
ts文件
1 | import * as userData from './data.json'; |
命名空间
在 TS
中,export
和 import
称为 外部模块,TS
中还支持一种内部模块namespace
,它的主要作用只是单纯的在文件内部(模块内容)隔离作用域
1 | namespace k1 { |
自用配置
1 | { |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 小康博客!
评论
TwikooWaline