模块 module
模块:在自身的作用域里执行,不是在全局作用域中,若是外部想要使用需要导入导出。
好处:1、提高了代码的复用性 2、解决命名冲突 3、提高代码的可维护性
模块导入导出:export (interface、class、变量、function)
exprot {a as b } import b from
export defult 导入: import module from
export = 导入: import module = require("module")
模块化实现:1、立即执行函数,解决作用域问题 IFEE
2、AMD 依赖先加载,后使用
define(["require", "exports", "./mod"], function (require, exports, mod_1) {
exports.t = mod_1.something + 1;
});
3、CommonJS nodejs端
let mod_1 = require("./mod"); exports.t = mod_1.something + 1;
4、UMD CommonJS与AMD的整合,判断当前环境,什么环境执行什么代码
5、ES Module 如上文所示
CommonJS与ES module的区别
1、导入导出方式不同 cjs: exports.a = A; let a = resuqire('./a') ESM: export import {} from
2、cjs是同步导出,esm是异步导出
3、cjs是值导出,esm是实时导出
4、cjs 支持 ${} 动态导入,esm不支持
命名空间 namesapce
namespace A {}
全局命名空间 declare namespace A {}
模块与命名空间的区别
命名空间是全局命名空间下一个普通的对象,易于使用,但依赖关系混乱;
模块会把依赖放在依赖加载器上,依赖关系清晰,利于维护,更好的封闭性
模块解析
相对模块:在相对路径下去查找对应的ts、的d.ts
非相对模块:在tsconfig设置的baseUrl的路径下,从内层向外层查找
classic解析策略 (AMD | System | ES2015默认):查找ts、d.ts
node解析策略:查找ts、d.ts、package.json(mian)、index.ts、index.d.ts
声明合并
interface:可以合并、两个之间属性不可重复
enum: 可以合并,两者之间属性不可重复,且只能有一个第一个元素省略初始值
type:不可合并
class:不可合并
namespace: 可以合并,未导出的部分只在自己的命名空间中可以访问
装饰器
@expression
能够被附加到类声明,方法, 访问符,属性或参数上
多个装饰器:
1、自上而下求值
2、自内而外求解