本篇将介绍TypeScript里的模块,和使用方法。

在ECMAScript 2015标准里,JavaScript新增了模块的概念。TypeScript也沿用了这个概念。

一、模块的导入和导出

模块在其自身的作用域里执行,而不是在全局作用域里;这意味着定义在一个模块里的变量,函数,类等等在模块外部是不可见的,除非你明确地使用export之一导出它们。 相反,如果想使用其它模块导出的变量,函数,类,接口等的时候,你必须要导入它们,可以使用import之一。

模块是自声明的。在TypeScript里,两个模块之间的关系是通过在文件级别上使用import和export建立的。下面是一个基本例子:

animal.ts

 export class Animal {
name: string;
show(): string {
return this.name;
}
}

app.ts

 import {Animal} from './animal';
let dog = new Animal();
dog.name = '狗狗';
dog.show();

上面的例子里,在animal.ts里声明了一个类Animal,通过export导出。在app.ts里,指定相对文件路径,通过import导入,就可以使用Animal类。

因为JavaScript存在两种不同的模块引用方式,在编译成JavaScript时,可以通过TypeScript配置文件tsconfig.json指定编译之后的模块引用方式

 {
"compilerOptions": {
"target": "es5",
"noImplicitAny": false,
"module": "commonjs", // 模块引用方式。候选值有:commonjs、amd等
"removeComments": false,
"sourceMap": false,
"outDir": "js"
},
"include":[
"ts"
],
"exclude": [
"js"
]
}

下面分别是使用不同的方式编译后的JavaScript文件内容

commonjs

 "use strict";
var Animal = (function () {
function Animal() {
}
Animal.prototype.show = function () {
return this.name;
};
return Animal;
}());
exports.Animal = Animal;

animal.js

 'use strict';
var animal_1 = require('./animal');
var dog = new animal_1.Animal();
dog.name = '狗狗';
dog.show();

app.js

amd

 define(["require", "exports"], function (require, exports) {
"use strict";
var Animal = (function () {
function Animal() {
}
Animal.prototype.show = function () {
return this.name;
};
return Animal;
}());
exports.Animal = Animal;
});

animal.js

 define(["require", "exports", './animal'], function (require, exports, animal_1) {
'use strict';
var dog = new animal_1.Animal();
dog.name = '狗狗';
dog.show();
});

app.js

二、导入和导出的重命名

模块导入和导出时默认使用的内部对象的名称。TypeScript也支持在导出前和导入后进行重命名。将上面的例子修改一下

animal.ts

 class Animal {
name: string;
show(): string {
return this.name;
}
} export {Animal as ANI};

app.ts

 import {ANI as Animal} from './animal';
let dog = new Animal();
dog.name = '狗狗';
dog.show();

导入和导出时,通过as关键字对模块进行重命名。

这个地方有一点要注意,当导出的模块重命名后,导入时重命名前的模块名要与导出重命名后的模块名保持一致,否则编译器将提示错误信息。以上面的这个例子为例,导出的模块被重命名为ANI,将此模块在另外一个文件app.ts里导入时,as关键字前面的模块名必须是ANI。

或者,如果不知道导入模块的名称,则可以用*号代替

 import * as animal_module from './animal';
let dog = new animal_module.ANI();
dog.name = '狗狗';
dog.show();

上面的例子里,对*号代替的所有模块进行重命名为animal_module,则通过animal_module对象可以访问到模块里导出的所有内容。

三、导出和导出多个对象

通常情况,模块里会定义多个类型对象,然后一并导出。而导入的模块里也可能会有多个

animal.ts

 enum HairColor {
Golden,
Black,
White
} class Animal {
name: string;
color: HairColor;
show(): string {
return this.name;
}
} export {Animal, HairColor};

app.ts

 import * as animal_module from './animal';
let dog = new animal_module.Animal();
dog.name = '狗狗';
dog.color = animal_module.HairColor.Golden;
dog.show();

导出时,可以将要导出的类型对象重新组装成一个json对象,然后导出。导入后,可以通过重命名的模块对象访问里面的内容。

四、默认导出

一个模块的默认导出只能有一个

animal.ts

 class Animal {
name: string;
show(): string {
return this.name;
}
} export default Animal;

app.ts

 import Animal from './animal';
let dog = new Animal();
dog.name = '狗狗';
dog.show();

在上面的例子里,通过default关键字,将Animal类导出。与一般的导入不同的是,导入默认的导出模块时,可以直接指定导入的模块名称,而不需要用{}花括号括起来。

五、动态加载模块

因为在JavaScript里,模块加载方式分别有两种:CommonJS和AMD。在用TypeScript时,要根据最终编译生成JavaScript的方式的配置内容不同,编写不同的代码。

模块文件animal.ts

 class Animal {
name: string;
show(): string {
return this.name;
}
} export {Animal};

CommonJS方式引用:

app.ts

 // 定义加载方法
declare function require(moduleName: string): any; import {Animal} from './animal'; if (true) {
let Animal_Type: typeof Animal = require('./animal');
let dog = new Animal_Type();
dog.name = '狗狗';
dog.show();
}

AMD方式引用:

app.ts

 // 定义加载方法
declare function require(moduleNames: string[], onLoad: (...args: any[]) => void): void; import {Animal} from './animal'; if (true) {
require(["./animal"], (Animal_Type: typeof Animal) => {
let dog = new Animal_Type();
dog.name = '狗狗';
dog.show();
});
}

TypeScript学习笔记(六) - 模块的更多相关文章

  1. Typescript 学习笔记六:接口

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  2. Typescript 学习笔记七:泛型

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  3. Typescript 学习笔记五:类

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  4. Typescript 学习笔记四:回忆ES5 中的类

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  5. Typescript 学习笔记二:数据类型

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  6. Typescript 学习笔记三:函数

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  7. Typescript 学习笔记一:介绍、安装、编译

    前言 整理了一下 Typescript 的学习笔记,方便后期遗忘某个知识点的时候,快速回忆. 为了避免凌乱,用 gitbook 结合 marketdown 整理的. github地址是:ts-gitb ...

  8. TypeScript学习笔记(八):1.5版本之后的模块和命名空间

    我之前有写过TS1.5版本之前的“模块”的笔记:TypeScript学习笔记(七):模块 但是TS这里的模块和在ECMAScript 2015里的模块(即JS原生支持了模块的概念)概率出现了混淆,所以 ...

  9. python3.4学习笔记(六) 常用快捷键使用技巧,持续更新

    python3.4学习笔记(六) 常用快捷键使用技巧,持续更新 安装IDLE后鼠标右键点击*.py 文件,可以看到Edit with IDLE 选择这个可以直接打开编辑器.IDLE默认不能显示行号,使 ...

  10. java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)

    java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessCo ...

随机推荐

  1. 53. Maximum Subarray(动态规划 求最大子数组)

      Find the contiguous subarray within an array (containing at least one number) which has the larges ...

  2. SQL group by的使用

    ①定义 "group by" 从字面上理解是根据“by"指定的规则对数据进行分组 ②简单示例 ③group by 中的select字段是受限制的 select指定的字段要 ...

  3. struts2中的错误--java.lang.NoClassDefFoundError: org/apache/commons/lang3/StringUtils

    2013-4-7 10:13:56 org.apache.catalina.startup.HostConfig checkResources 信息: Reloading context [/chap ...

  4. Android 自定义View-字母索引表(一)

    在有些Android应用中,为了方便快速定位,经常会看到屏幕右侧有一个字母索引表,今天尝试使用自定义View的方式实现了索引表的基本布局. 字母索引表的样式如下面的示意图所示, 此时我们至少需要知道以 ...

  5. PostgreSQL 9.3:在windows(包括win7)下的安装与正确配置

    首先,以下是常用命令: ③ initdb 初始化 数据库. ④ pg_ctl start 启动数据库 ⑤ pg_ctl stop 停止数据库 ⑥ post_svc -install 建立windows ...

  6. Java生成PDF之iTextPDF的使用

    今天做财务方面相关数据的导出功能,需要导出PDF和Excel,在项目经理那里得知有一个叫iTextPDF的java框架导出PDF文件很好用,于是拿来玩儿玩儿. package com.smart.pr ...

  7. ifconfig源码分析之与内核交互数据

    <ifconfig源码分析之与内核交互数据>本文档的Copyleft归rosetta所有,使用GPL发布,可以自由拷贝.转载,转载时请保持文档的完整性.参考资料:<Linux设备驱动 ...

  8. 《Effective Java 2nd》第8章 通用程序设计

    目录 第45条 将局部变量的作用域最小化 第46条 for-each循环优先于传统的for循环 第47条 了解和使用类库 第48条 如果需要精确的答案,避免使用float和double 第49条 基本 ...

  9. codeforces 356 div2 C.Bear and Prime 100 数学

    C. Bear and Prime 100 time limit per test 1 second memory limit per test 256 megabytes input standar ...

  10. 使用 for 循环

    for 循环通过迭代一个给定向量或列表,重复执行某个表达式.for 循环的语法是这样的:for (var in vector) {expr}var 遍历 vector 中的各个元素值,expr 被反复 ...