TypeScript中的命名空间可将那些具有内在联系的接口、类或对象等代码组织在一起,既能隔离作用域,也能避免命名冲突,并且使得代码结构清晰,更易追踪。在命名空间内部,所有实体部分默认都是私有的,需要由export关键字导出之后,才能在外部访问,如下所示。

namespace Util {
export function log(msg) {
console.log(msg);
}
}
Util.log("strick");

  TypeScript会将上面的命名空间编译成两部分:Util变量和即时函数,如下代码所示,这是一种常见的模块化封装。

var Util;
(function(Util) {
function log(msg) {
console.log(msg);
}
Util.log = log;
})(Util || (Util = {}));
Util.log("strick");

  注意,由于TypeScript 1.5为了与ES6的术语保持一致,已将内部模块改为命名空间,外部模块简称为模块,因此原先用于内部模块的module关键字和现在的namespace关键字在功能上是一样的。但是为了避免被ES6、CommonJS、UMD等模块概念中的相似名称所迷惑,官方推荐使用namespace。

一、分离

  当命名空间膨胀的过大时,为了便于维护,有必要将其分离到各个文件中。例如将命名空间分到三个文件中,第一个util.ts文件的代码如下。

namespace Util {
export function log(msg) {
console.log(msg);
}
}

  第二个validator.ts文件的代码如下。

namespace Validator {
export function isAcceptable(str) {
return str.length > ;
}
}

  第三个default.ts文件的代码如下所示,其中三斜线指令用来通知编译器在编译时需要引入的外部文件,并且它必须声明在文件顶部。

/// <reference path="util.ts" />
/// <reference path="validator.ts" />
let str = "abc";
if(Validator.isAcceptable(str)) {
Util.log("success");
}

  当需要处理多个包含命名空间的文件时,有两种方式可确保编译后的代码按正确顺序加载。第一种是在输入编译命令时添加--outFile参数,如下所示,其后会跟一个输出的脚本文件以及一个或多个要编译的文件。

tsc --outFile default.js default.ts

  第二种是将编译后的脚本通过HTML的<script>元素在页面中按正确的顺序引入,如下所示。

<script src="util.js"></script>
<script src="validator.js"></script>
<script src="default.js"></script>

二、别名

  命名空间支持嵌套,即在内部声明另一个命名空间,如下所示。

namespace Shape {
export namespace Polygon {
export class Triangle { }
export class Square { }
}
}

  当引用这类命名空间时,可以通过import关键字为其取一个短的别名,如下代码所示。注意,不要与加载模块的import语法相混淆,此处import的右侧必须包含命名空间。

import P = Shape.Polygon;
import Triangle = Shape.Polygon.Triangle;
let sq = new P.Square();
let triangle = new Triangle();

  通过编译后的代码可以发现,由于import是var的语法糖(如下代码所示),因此改变P或Triangle变量的值不会影响命名空间的引用。

var P = Shape.Polygon;
var Triangle = Shape.Polygon.Triangle;
var sq = new P.Square();
var triangle = new Triangle();

TypeScript躬行记(7)——命名空间的更多相关文章

  1. TypeScript躬行记(8)——装饰器

    装饰器(Decorator)可声明在类及其成员(例如属性.方法等)之上,为它们提供一种标注,用于分离复杂逻辑或附加额外逻辑,其语法形式为@expression.expression是一个会在运行时被调 ...

  2. TypeScript躬行记(1)——数据类型

    TypeScript不仅支持JavaScript所包含的数据类型,还额外扩展了许多实用的数据类型,例如枚举.空值.任意值等. 一.JavaScript的数据类型 JavaScript的数据类型包括6种 ...

  3. TypeScript躬行记(2)——接口

    在传统的面向对象语言中,接口(Interface)好比协议,它会列出一系列的规则(即对行为进行抽象),再由类来实现这些规则.而TypeScript中的接口更加灵活,除了包含常规的作用之外,它还能扩展其 ...

  4. TypeScript躬行记(3)——类

    类是对对象的抽象,描述了对象的特征和行为,而对象就是类的实例.ES6引入了类的概念(相关内容可参考ES类和ES6类的继承两节),TypeScript在此基础上,不仅根据ES7等规范完善了类的语法,还添 ...

  5. TypeScript躬行记(5)——类型兼容性

    TypeScript是一种基于结构类型的语言,可根据其成员来描述类型.以结构相同的Person接口和Programmer类为例,如下所示. interface Person { name: strin ...

  6. TypeScript躬行记(6)——高级类型

    本节将对TypeScript中类型的高级特性做详细讲解,包括交叉类型.类型别名.类型保护等. 一.交叉类型 交叉类型(Intersection Type)是将多个类型通过“&”符号合并成一个新 ...

  7. TypeScript躬行记(4)——泛型

    泛型是程序设计语言中的一种风格或范式,相当于类型模板,允许在声明类.接口或函数等成员时忽略类型,而在未来使用时再指定类型,其主要目的是为它们提供有意义的约束,提升代码的可重用性. 一.泛型参数 当一个 ...

  8. ES6躬行记(1)——let和const

    古语云:“纸上得来终觉浅,绝知此事要躬行”.的确,不管看了多少本书,如果自己不实践,那么就很难领会其中的精髓.自己研读过许多ES6相关的书籍和资料,平时工作中也会用到,但在用到时经常需要上搜索引擎中查 ...

  9. ES6躬行记 笔记

    ES6躬行记(18)--迭代器 要实现以下接口## next() ,return,throw 可以用for-of保证迭代对象的正确性 例如 var str = "向

随机推荐

  1. MaxCompute Mars开发指南

    Mars 算法实践 人脸识别 Mars 是一个基于矩阵的统一分布式计算框架,而且 Mars 已经在 GitHub 中开源.当你看完 Mars 的介绍可能会问它能做什么,这几乎取决于你想做什么,因为 M ...

  2. HDFS命令行界面

  3. 非常优秀的Javascript(AJAX) 开发工具:Aptana

    非常优秀的Javascript(AJAX) 开发工具:Aptana 下面我要向你介绍一款非常优秀的Javascript(AJAX) 开发工具:Aptana.应为它实在太棒了,所以我忍不住想向你推荐它. ...

  4. Project Euler Problem 18-Maximum path sum I & 67-Maximum path sum II

    基础的动态规划...数塔取数问题. 状态转移方程: dp[i][j] = num[i][j] + max(dp[i+1][j],dp[i+1][j+1]);

  5. 洛谷 2403 [SDOI2010] 所驼门王的宝藏

    题目描述 在宽广的非洲荒漠中,生活着一群勤劳勇敢的羊驼家族.被族人恭称为“先知”的Alpaca L. Sotomon是这个家族的领袖,外人也称其为“所驼门王”.所驼门王毕生致力于维护家族的安定与和谐, ...

  6. xml path 列转行实例

    SQL Server2005提供了一个新查询语法——For XML PATH(''),这个语法有什么用呢?想象一下这样一个查询需求:有两个表,班级表A.学生表B,要查询一个班级里有哪些学生?针对这个需 ...

  7. nio FileChannel中文乱码问题

    最近用nio读取文件时,英文正常,读取中文时会出现乱码,经查可以用Charset类来解决: 代码如下: package com.example.demo; import java.io.FileNot ...

  8. 基于thinkphp实现根据用户ip判断地理位置并提供对应天气信息的应用

    https://blog.csdn.net/MyCodeDream/article/details/46706469 我们都知道,在很多的网站都提供了给用户提供天气预报的功能,有时会发现,用户即使不输 ...

  9. Adam那么棒,为什么还对SGD念念不忘 (3)—— 优化算法的选择与使用策略

    在前面两篇文章中,我们用一个框架梳理了各大优化算法,并且指出了以Adam为代表的自适应学习率优化算法可能存在的问题.那么,在实践中我们应该如何选择呢? 本文介绍Adam+SGD的组合策略,以及一些比较 ...

  10. codeforces 1230 div2

    C 给一个图,并且在边上放上多米诺骨牌,使得每个多米诺骨牌指向的顶点的数字是一致的,并且每种骨牌只能用一种.问最多能够覆盖多少条边. 先生成每一个点指向的数字,然后判断就好了. #include< ...