我之前有写过TS1.5版本之前的“模块”的笔记:TypeScript学习笔记(七):模块

但是TS这里的模块和在ECMAScript 2015里的模块(即JS原生支持了模块的概念)概率出现了混淆,所以在1.5的版本里,为了与ECMAScript 2015里的术语保持一致,“内部模块”现在称做“命名空间”,“外部模块”现在则简称为“模块”。

下面摘录自Egret博客的一段详细解释(连接):

大体意思就是 TS1.5 以后,推荐全面使用namespace关键字代替module。因为JS里本身就有module的概念,而且已经是ES6标准里的关键字,各种加载框架比如CommonJS,AMD等也都有module的概念,但是TS里之前的module关键字与他们都不太相同。所以换了一个关键字加以区分,避免造成概念上的混淆。实际语法上,使用namespace等价于TS以前使用的module,然后推荐代码中不要再出现module关键字,这个关键字基本上变成了一个编译后和运行时里的概念,留给纯JS中使用。

如果要用一句话解释TS里的namespace与JS里module的区别,那主要在于文件上:TS里的namespace是跨文件的,JS里的module是以文件为单位的,一个文件一个module。

TS里的namespace主要是解决命名冲突的问题,会在全局生成一个对象,定义在namespace内部的类都要通过这个对象的属性访问,例如 egret.DisplayObject,egret就是namespace的对象,DisplayObject则是那个类名。因为是注册到全局的,所以跨文件也能正常使用,不同的文件能够读取其他文件注册在全局的命名空间内的信息,也可以注册自己的。namespace其实比较像其他面向对象编程语言里包名的概念。

而JS里的module,主要是解决加载依赖关系的。跟文件绑定在一起,一个文件就是一个module。在一个文件中访问另一个文件必须要加载另一个文件。在NodeJS里是用CommonJS处理模块加载,因为是运行在本地,所以可以同步加载,写起来也比较方便。用到一个文件就require它一下,作为一个变量。而在Web端的RequireJS使用的是AMD处理模块加载,是异步的。其实就是把所有代码写在回调里,先去异步加载依赖的所有文件。

所以可以简单的理解,namespace的概念等同于包名,module的概念等同于文件。

下面我们来分别看看。

命名空间

把之前的module关键字换成namespace关键字即可,使用方法和功能都不变,类似Java的包或C#的命名空间。当然,不替换或者继续使用module关键字也是可以的,但是会出现概念混淆的情况,最好按照官方的说法,统一使用namespace吧,包括*.d.ts文件。

另外对于存在依赖关系的文件,仍然可以使用:

/// <reference path="SimpleWebSocket.ts"/>

方式来指定当前文件依赖的其它文件。

模块

TS中,对模块也是支持的,如果对JS的模块不熟悉可以查看这篇笔记

使用什么标准

我们知道JS中模块有多种标准,一般常用的有两种,针对Node.js同步加载的CommonJS,和针对浏览器异步加载的AMD,在TS项目中,有一个tsconfig.json的文件,一般如下:

 {
"compilerOptions": {
"module": "commonjs",
"target": "es5",
"sourceMap": true
},
"exclude": [
"node_modules"
]
}

其中的module表示模块使用的标准,默认是CommonJS标准。

TS模块代码

模块代码,Utils.ts:

 export const version: number = 0.1;

 export class Utils {
static add(a: number, b: number): number {
return a + b;
} private _name: string; constructor(name: string) {
this._name = name;
} sayHi(): void {
console.log("Hi, I am " + this._name);
}
}

注意不要使用module或namespace进行包含,直接使用export导出即表示要导出到外部可以访问的对象。

使用模块代码,App.ts:

 import * as utils from "./Utils";

 console.log(utils.version);

 var obj = new utils.Utils("Li Lei");
obj.sayHi();

使用TS的导入写法即可,详情点击这里

CommonJS编译后的代码

Utils.js:

 "use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.version = 0.1;
var Utils = (function () {
function Utils(name) {
this._name = name;
}
Utils.add = function (a, b) {
return a + b;
};
Utils.prototype.sayHi = function () {
console.log("Hi, I am " + this._name);
};
return Utils;
}());
exports.Utils = Utils;

App.js:

 "use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var utils = require("./Utils");
console.log(utils.version);
var obj = new utils.Utils("Li Lei");
obj.sayHi();

上面生成的代码可以在Node.js中使用。

AMD编译后的代码

先修改tsconfig.json如下:

 {
"compilerOptions": {
"module": "amd",
"target": "es5",
"sourceMap": true
},
"exclude": [
"node_modules"
]
}

编译之后,Utils.js:

 define(["require", "exports"], function (require, exports) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.version = 0.1;
var Utils = (function () {
function Utils(name) {
this._name = name;
}
Utils.add = function (a, b) {
return a + b;
};
Utils.prototype.sayHi = function () {
console.log("Hi, I am " + this._name);
};
return Utils;
}());
exports.Utils = Utils;
});

App.js:

 define(["require", "exports", "./Utils"], function (require, exports, utils) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
console.log(utils.version);
var obj = new utils.Utils("Li Lei");
obj.sayHi();
});

上面的代码可以在浏览器中使用,注意要引入require.js库就行。

TypeScript学习笔记(八):1.5版本之后的模块和命名空间的更多相关文章

  1. python3.4学习笔记(八) Python第三方库安装与使用,包管理工具解惑

    python3.4学习笔记(八) Python第三方库安装与使用,包管理工具解惑 许多人在安装Python第三方库的时候, 经常会为一个问题困扰:到底应该下载什么格式的文件?当我们点开下载页时, 一般 ...

  2. Learning ROS forRobotics Programming Second Edition学习笔记(八)indigo rviz gazebo

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS forRobotics Pro ...

  3. Typescript 学习笔记七:泛型

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

  4. Typescript 学习笔记六:接口

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

  5. Typescript 学习笔记五:类

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

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

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

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

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

  8. Typescript 学习笔记三:函数

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

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

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

随机推荐

  1. 关于make: *** No rule to make target `clean'. Stop.这个莫名其妙问题的解决方法

    执行make编译命令总报错,后来试试make clean命令也不行,报下面的错. make: *** No rule to make target `clean'.  Stop. 真是莫名其妙的错误, ...

  2. epoll使用详解

    目录 epoll介绍 Epoll的优点: 1.支持一个进程打开大数目的socket描述符(FD) 2.IO效率不随FD数目增加而线性下降 3.支持边缘触发模式 4.使用mmap加速内核与用户空间的消息 ...

  3. C++泛型线性查找算法——find

    C++泛型线性查找算法--find <泛型编程和STL>笔记及思考. 线性查找可能是最为简单的一类查找算法了.他所作用的数据结构为一维线性的空间.这篇文章主要介绍使用 C++ 实现泛型算法 ...

  4. javascript高级部分

    回顾 回顾: 整体: - HTML - CSS - JavaScript - 基本数据类型 - for,while.. - DOM - obj = document.getElementById('. ...

  5. windows + php + redis的安装

    我讲述一下我在 php 中安装 redis 的详细过程,仅供参考: 系统版本:windows7 + 64 位操作系统. php版本 : php5.6 redis版本 : redis 2.2.7 (由于 ...

  6. 通过css实现小三角形

    下面是用css做小三角形的demo, <!DOCTYPE html><html lang="en"><head> <meta charse ...

  7. oracle多个结果集拼接字符串;where id in 字符串 (转)

    转自:http://blog.sina.com.cn/s/blog_af26e333010194ht.html 最近修改oracle触发器,在过程中遇到两个问题: select lastname fr ...

  8. Asp.Net Mvc 自定义扩展

    目录: 自定义模型IModelBinder 自定义模型验证 自定义视图引擎 自定义Html辅助方法 自定义Razor辅助方法 自定义Ajax辅助方法 自定义控制器扩展 自定义过滤器 自定义Action ...

  9. 来自极客头条的 15个常用的javaScript正则表达式

    摘要收集整理了15个常用的javaScript正则表达式,其中包括用户名.密码强度.整数.数字.电子邮件地址(Email).手机号码.身份证号.URL地址. IPv4地址. 十六进制颜色. 日期. Q ...

  10. Java之String、StringBuilder、StringBuffer的区别

    String : 字符串常量,它们的值在创建之后不能更改.代表字符串,Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现. String的值是不可变的,这就 ...