- TypeScript 基础
- TypeScript - 首页
- TypeScript - 路线图
- TypeScript - 概述
- TypeScript - 环境搭建
- TypeScript - 基本语法
- TypeScript vs. JavaScript
- TypeScript - 特性
- TypeScript - 变量
- TypeScript - let & const
- TypeScript - 运算符
- TypeScript 基本类型
- TypeScript - 类型
- TypeScript - 类型注解
- TypeScript - 类型推断
- TypeScript - 数字
- TypeScript - 字符串
- TypeScript - 布尔值
- TypeScript - 数组
- TypeScript - 元组
- TypeScript - 枚举
- TypeScript - Any
- TypeScript - Never
- TypeScript - 联合类型
- TypeScript - 字面量类型
- TypeScript - 符号
- TypeScript - null vs. undefined
- TypeScript - 类型别名
- TypeScript 控制流
- TypeScript - 决策
- TypeScript - If 语句
- TypeScript - If Else 语句
- TypeScript - 嵌套 If 语句
- TypeScript - Switch 语句
- TypeScript - 循环
- TypeScript - For 循环
- TypeScript - While 循环
- TypeScript - Do While 循环
- TypeScript 函数
- TypeScript - 函数
- TypeScript - 函数类型
- TypeScript - 可选参数
- TypeScript - 默认参数
- TypeScript - 匿名函数
- TypeScript - 函数构造器
- TypeScript - Rest 参数
- TypeScript - 参数解构
- TypeScript - 箭头函数
- TypeScript 接口
- TypeScript - 接口
- TypeScript - 扩展接口
- TypeScript 类和对象
- TypeScript - 类
- TypeScript - 对象
- TypeScript - 访问修饰符
- TypeScript - 只读属性
- TypeScript - 继承
- TypeScript - 静态方法和属性
- TypeScript - 抽象类
- TypeScript - 访问器
- TypeScript - 鸭子类型
- TypeScript 高级类型
- TypeScript - 交叉类型
- TypeScript - 类型守卫
- TypeScript - 类型断言
- TypeScript 类型操作
- TypeScript - 从类型创建类型
- TypeScript - Keyof 类型运算符
- TypeScript - Typeof 类型运算符
- TypeScript - 索引访问类型
- TypeScript - 条件类型
- TypeScript - 映射类型
- TypeScript - 模板字面量类型
- TypeScript 泛型
- TypeScript - 泛型
- TypeScript - 泛型约束
- TypeScript - 泛型接口
- TypeScript - 泛型类
- TypeScript 其他
- TypeScript - 三斜杠指令
- TypeScript - 命名空间
- TypeScript - 模块
- TypeScript - 环境声明
- TypeScript - 装饰器
- TypeScript - 类型兼容性
- TypeScript - 日期对象
- TypeScript - 迭代器和生成器
- TypeScript - Mixins
- TypeScript - 实用程序类型
- TypeScript - 装箱和拆箱
- TypeScript - tsconfig.json
- 从 JavaScript 到 TypeScript
- TypeScript 有用资源
- TypeScript - 快速指南
- TypeScript - 有用资源
- TypeScript - 讨论
TypeScript - 模块
模块的设计理念是为了组织用 TypeScript 编写的代码。模块主要分为以下两种:
- 内部模块
- 外部模块
内部模块
内部模块出现在 TypeScript 的早期版本中。它用于将类、接口、函数逻辑地组合成一个单元,并且可以导出到其他模块中。这种逻辑分组在最新版本的 TypeScript 中被称为命名空间。因此,内部模块已过时,建议使用命名空间代替。内部模块仍然受支持,但建议使用命名空间而不是内部模块。
内部模块语法(旧)
module TutorialPoint { export function add(x, y) { console.log(x+y); } }
命名空间语法(新)
namespace TutorialPoint { export function add(x, y) { console.log(x + y);} }
两种情况下生成的 JavaScript 代码相同。
var TutorialPoint; (function (TutorialPoint) { function add(x, y) { console.log(x + y); } TutorialPoint.add = add; })(TutorialPoint || (TutorialPoint = {}));
外部模块
TypeScript 中的外部模块用于指定和加载多个外部 js 文件之间的依赖关系。如果只使用一个 js 文件,则外部模块不相关。传统上,JavaScript 文件之间的依赖关系管理是使用浏览器脚本标签 (<script></script>) 完成的。但这不可扩展,因为它在加载模块时非常线性。这意味着,除了按顺序加载文件之外,没有异步加载模块的选项。例如,当您为服务器(例如 NodeJs)编写 js 代码时,甚至没有脚本标签。
从单个主 JavaScript 文件加载依赖 js 文件有两种情况。
- 客户端 - RequireJs
- 服务器端 - NodeJs
选择模块加载器
为了支持加载外部 JavaScript 文件,我们需要一个模块加载器。这将是另一个 js 库。对于浏览器,最常用的库是 RequieJS。这是 AMD(异步模块定义)规范的实现。AMD 可以分别加载所有文件,即使它们相互依赖,而不是按顺序加载文件。
定义外部模块
在定义目标为 CommonJS 或 AMD 的 TypeScript 外部模块时,每个文件都被视为一个模块。因此,在外部模块中使用内部模块是可选的。
如果您正在将 TypeScript 从 AMD 迁移到 CommonJs 模块系统,则无需执行任何其他操作。您只需要更改编译器标志。与 JavaScript 不同,从 CommonJs 迁移到 AMD 或反之亦然存在开销。
声明外部模块的语法是使用关键字“export”和“import”。
语法
//FileName : SomeInterface.ts export interface SomeInterface { //code declarations }
要在另一个文件中使用已声明的模块,可以使用 import 关键字,如下所示。仅指定文件名,不使用扩展名。
import someInterfaceRef = require(“./SomeInterface”);
示例
让我们通过一个示例来了解这一点。
// IShape.ts export interface IShape { draw(); } // Circle.ts import shape = require("./IShape"); export class Circle implements shape.IShape { public draw() { console.log("Cirlce is drawn (external module)"); } } // Triangle.ts import shape = require("./IShape"); export class Triangle implements shape.IShape { public draw() { console.log("Triangle is drawn (external module)"); } } // TestShape.ts import shape = require("./IShape"); import circle = require("./Circle"); import triangle = require("./Triangle"); function drawAllShapes(shapeToDraw: shape.IShape) { shapeToDraw.draw(); } drawAllShapes(new circle.Circle()); drawAllShapes(new triangle.Triangle());
为 AMD 系统编译主 TypeScript 文件的命令为:
tsc --module amd TestShape.ts
编译后,它将为 AMD 生成以下 JavaScript 代码。
文件:IShape.js
//Generated by typescript 1.8.10 define(["require", "exports"], function (require, exports) { });
文件:Circle.js
//Generated by typescript 1.8.10 define(["require", "exports"], function (require, exports) { var Circle = (function () { function Circle() { } Circle.prototype.draw = function () { console.log("Cirlce is drawn (external module)"); }; return Circle; })(); exports.Circle = Circle; });
文件:Triangle.js
//Generated by typescript 1.8.10 define(["require", "exports"], function (require, exports) { var Triangle = (function () { function Triangle() { } Triangle.prototype.draw = function () { console.log("Triangle is drawn (external module)"); }; return Triangle; })(); exports.Triangle = Triangle; });
文件:TestShape.js
//Generated by typescript 1.8.10 define(["require", "exports", "./Circle", "./Triangle"], function (require, exports, circle, triangle) { function drawAllShapes(shapeToDraw) { shapeToDraw.draw(); } drawAllShapes(new circle.Circle()); drawAllShapes(new triangle.Triangle()); });
为 Commonjs 系统编译主 TypeScript 文件的命令为
tsc --module commonjs TestShape.ts
编译后,它将为 Commonjs 生成以下 JavaScript 代码。
文件:Circle.js
//Generated by typescript 1.8.10 var Circle = (function () { function Circle() { } Circle.prototype.draw = function () { console.log("Cirlce is drawn"); }; return Circle; })(); exports.Circle = Circle;
文件:Triangle.js
//Generated by typescript 1.8.10 var Triangle = (function () { function Triangle() { } Triangle.prototype.draw = function () { console.log("Triangle is drawn (external module)"); }; return Triangle; })(); exports.Triangle = Triangle;
文件:TestShape.js
//Generated by typescript 1.8.10 var circle = require("./Circle"); var triangle = require("./Triangle"); function drawAllShapes(shapeToDraw) { shapeToDraw.draw(); } drawAllShapes(new circle.Circle()); drawAllShapes(new triangle.Triangle());
输出
Cirlce is drawn (external module) Triangle is drawn (external module)