本篇将介绍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. #C++初学记录(并查集)

    并查集 题目 今天是伊格那丢的生日.他邀请了很多朋友.现在该吃晚饭了.伊格那丢想知道他至少需要多少张桌子.你必须注意到并不是所有的朋友都认识对方,而且所有的朋友都不想和陌生人待在一起.这个问题的一个重 ...

  2. hdu 5103 状态压缩dp

    这题说的是给了n(14)个点,每个点都以他 为根的最大可容的孩子个数和最小的可溶孩子个数L[i] ,R[i] 问这n个点形成一棵树有多少种形态 我们让 dp[i][S] 表示 一 i为根节点 的 拥有 ...

  3. this指向 - 浏览器环境

    1.全局上下文中的 this <!DOCTYPE html> <html lang="en"> <head> <meta charset= ...

  4. android系统提供的几种颜色Color

    http://blog.csdn.net/feiyangxiaomi/article/details/38338305 记录一下android自带颜色. Constants public static ...

  5. 20162326 qilifeng 2018-2019-2 《网络对抗技术》Exp0 Kali安装 Week1

    <网络对抗技术>第1次作业 (一)作业任务 1.安装kali 2.设置共享文件夹 (二)操作过程 1.安装kali 因为之前安装过Oracle 的VM VirtualBox 所以直接 进入 ...

  6. impress.js初体验——前端装X利器

    impress.js 是国外一位开发者受 Prezi 启发,采用 CSS3 与 JavaScript 语言完成的一个可供开发者使用的表现层框架(演示工具).其功能包括画布的无限旋转与缩放,任意角度放置 ...

  7. Python学习札记(四十一) IO 1

    参考:IO NOTE A.Pre 1.IO在计算机中指Input/Output,也就是输入和输出. 2.IO编程中,Stream(流)是一个很重要的概念,可以把流想象成一个水管,数据就是水管里的水,但 ...

  8. 51Nod 1686 第K大区间(离散化+尺取法)

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1686 题意: 思路: 第K大值,所以可以考虑二分法,然后用尺取法去扫描, ...

  9. cocos2d-js入门二 环境搭建二

    电脑升级到WIN10后,cocos  code IDE安装不成功. 于是搭建新的环境JetBrainsWebStorm+chrome+JetBrains IDE Support,其中JetBrains ...

  10. Codeforces Round #307 (Div. 2) D. GukiZ and Binary Operations 矩阵快速幂优化dp

    D. GukiZ and Binary Operations time limit per test 1 second memory limit per test 256 megabytes inpu ...