模块语法
直接使用 Es6 的模块化语句就可以了
导入 ts 文件时,不要加后缀名,因为编译后是 js 文件,没有 .ts
编译结果中的模块化
可配置,直接配置 compolerOptions.module 就可配置编译结果中使用的编译模块语法
- 如果编译结果的模块化标准是 ES6, 没有区别
- 如果编译结果的模块化标准是 commonjs :导出的声明会变成 exports 的属性,***默认的导出会变成 exports 的 default 属性;***,在调用的时候会直接使用
exports.default
去调用
解决默认导入的错误
由于 commonjs 没有 export default 这种导出方法,但是 ts 在默认导入的时候,又会去 exports.default 去读取属性,所以如果去使用一些使用 commonjs 的库,
import fs from 'fs' // 这种称谓默认导入。
fs.readFileSync()
// 编译后
var fs_1 = require("fs");
fs_1["default"].readFileSync(); // 然后default上并没有这些属性,而应该直接使用 fs_1.xxx
// 解决办法
// 1.直接使用 commjs 的方式导入
const fs = require('fs')
// 2. 仍然使用 es6 module
import * as fs from 'fs'
import { readFileSync } from 'fs'
// 3. 配置 exModuleInterop: true
如何在 ts 中书写 commonjs 模块化
// 直接用本来的 commonjs 的语法,但是没办法使用类型检查。
// 使用类型检查
// 导出
export = {}
// 导入
import xxx = require('xxx')
模块解析
在 ts 中有两种模块解析策略
- classic: 经典(过时)
- node: node 解析策略