本篇将介绍TypeScript的命名空间,并简单说明一下与模块的区别。

在之前的例子里,有如下一段代码,通过修改这段代码来演示命名空间的用法。

 interface Animal {
name: string;
eat(): void;
} class Dog implements Animal {
name: string;
constructor(theName: string) {
this.name = theName;
} eat() {
console.log(`${this.name} 吃狗粮。`);
}
} class Cat implements Animal {
name: string;
constructor(theName: string) {
this.name = theName;
} eat() {
console.log(`${this.name} 吃猫粮。`);
}
}

一、命名空间的声明

同Java的包、.Net的命名空间一样,TypeScript的命名空间可以将代码包裹起来,只对外暴露需要在外部访问的对象。命名空间内的对象通过export关键字对外暴露。

将上面的例子进行修改

 namespace Biology {
export interface Animal {
name: string;
eat(): void;
} export class Dog implements Animal {
name: string;
constructor(theName: string) {
this.name = theName;
} eat() {
console.log(`${this.name} 吃狗粮。`);
}
} export class Cat implements Animal {
name: string;
constructor(theName: string) {
this.name = theName;
} eat() {
console.log(`${this.name} 吃猫粮。`);
}
}
} let dog: Biology.Animal;
dog = new Biology.Dog('狗狗');
dog.eat();

通过namespace关键字声明命名空间,通过export导出需要在外部使用的对象。在命名空间外部需要通过“完全限定名”访问这些对象。

二、命名空间的引用

通常情况下,声明的命名空间代码和调用的代码不在同一个文件里

biology.ts

 namespace Biology {
export interface Animal {
name: string;
eat(): void;
} export class Dog implements Animal {
name: string;
constructor(theName: string) {
this.name = theName;
} eat() {
console.log(`${this.name} 吃狗粮。`);
}
} export class Cat implements Animal {
name: string;
constructor(theName: string) {
this.name = theName;
} eat() {
console.log(`${this.name} 吃猫粮。`);
}
}
}

biology.ts

app.ts

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

 let dog: Biology.Animal;
dog = new Biology.Dog('狗狗');
dog.eat();

通过reference注释引用命名空间,即可通过“完全限定名”进行访问。

更有甚者,相同的命名空间会声明在不同的文件中

 namespace Biology {
export interface Animal {
name: string;
eat(): void;
}
}

biology.ts

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

 namespace Biology {
export class Dog implements Animal {
name: string;
constructor(theName: string) {
this.name = theName;
} eat() {
console.log(`${this.name} 吃狗粮。`);
}
}
}

dog.ts

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

 namespace Biology {
export class Cat implements Animal {
name: string;
constructor(theName: string) {
this.name = theName;
} eat() {
console.log(`${this.name} 吃猫粮。`);
}
}
}

cat.ts

 // app.ts

 /// <reference path="biology.ts" />
/// <reference path="cat.ts" />
/// <reference path="dog.ts" /> let dog: Biology.Animal;
dog = new Biology.Dog('狗狗');
dog.eat(); let cat: Biology.Animal;
cat = new Biology.Cat('喵星人');
cat.eat();

编译之后,每一个文件都将编译成对应的一个JavaScript文件,使用时需要将这些文件都引用进来。通过如下命令,可以将有相同命名空间的文件编译到一个JavaScript文件中,这样在引用时只需要一个文件即可。

 tsc --outFile js\biology.js ts\biology.ts ts\dog.ts ts\cat.ts

将biology.ts、dog.ts、cat.ts编辑到一个JavaScript文件biology.js文件内,编译后的文件内容如下

 /// <reference path="biology.ts" />
var Biology;
(function (Biology) {
var Dog = (function () {
function Dog(theName) {
this.name = theName;
}
Dog.prototype.eat = function () {
console.log(this.name + " \u5403\u72D7\u7CAE\u3002");
};
return Dog;
}());
Biology.Dog = Dog;
})(Biology || (Biology = {}));
/// <reference path="biology.ts" />
var Biology;
(function (Biology) {
var Cat = (function () {
function Cat(theName) {
this.name = theName;
}
Cat.prototype.eat = function () {
console.log(this.name + " \u5403\u732B\u7CAE\u3002");
};
return Cat;
}());
Biology.Cat = Cat;
})(Biology || (Biology = {}));

三、命名空间的别名

在引用命名空间时,可以通过import关键字起一个别名

 // app.ts

 /// <reference path="biology.ts" />
/// <reference path="cat.ts" />
/// <reference path="dog.ts" /> import bio_other = Biology; // 别名 let dog: bio_other.Animal;
dog = new bio_other.Dog('狗狗');
dog.eat(); let cat: bio_other.Animal;
cat = new bio_other.Cat('喵星人');
cat.eat();

四、命名空间与模块

命名空间:代码层面的归类和管理。将有相似功能的代码都归一到同一个空间下进行管理,方便其他代码引用。更多的是侧重代码的复用。

模块:一个完整功能的封装,对外提供的是一个具有完整功能的功能包,需要显式引用。一个模块里可能会有多个命名空间。

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. 【opencv学习笔记七】访问图像中的像素与图像亮度对比度调整

    今天我们来看一下如何访问图像的像素,以及如何改变图像的亮度与对比度. 在之前我们先来看一下图像矩阵数据的排列方式.我们以一个简单的矩阵来说明: 对单通道图像排列如下: 对于双通道图像排列如下: 那么对 ...

  10. (转)Qt Model/View 学习笔记 (七)——Delegate类

    Qt Model/View 学习笔记 (七) Delegate  类 概念 与MVC模式不同,model/view结构没有用于与用户交互的完全独立的组件.一般来讲, view负责把数据展示 给用户,也 ...

随机推荐

  1. 【android】开发笔记系列:行为篇

    1:键盘遮挡了输入框 在androidManifest.xml里,对应的activity里设置键盘模式 <activity android:name="活动名称" andro ...

  2. 对Java平台的理解

    1)  Java是一种面向对象的语言(封装,继承,多态),最显著的特性有两个方面: ----书写一次,到处运行(Write once,run anywhere) 能够非常容易的获得跨平台的能力 --- ...

  3. Flex开发框架cairngorm入门实例

    Cairngorm是flex开发的mvc框架,现在在 adobe旗下.它架构和eclipse插件开发gef架构很相似,具体工作原理如下: 该框架就是一个Cairngorm.swc文件,大家可以到Cai ...

  4. HttpClient-RestTemplate-Feign

    如何通过Java发送HTTP请求,通俗点讲,如何通过Java(模拟浏览器)发送HTTP请求. Java有原生的API可用于发送HTTP请求,即java.net.URL.java.net.URLConn ...

  5. ubinize的用法

    1.ubinize支持哪些选项 Usage: ubinize [options] <ini-file> Generate UBI images. An UBI image may cont ...

  6. ASP.NET WEB API 2: HTTP MESSAGE LIFECYLE

    https://www.asp.net/media/4071077/aspnet-web-api-poster.pdf 1.You can host Web API inside IIS or ins ...

  7. centos 升级python26到python27

    由于开发库依赖于python27,而自己安装的centos6.8自带的python是2.6.6,因此打算简单的做一下升级. 因为centos的yum依赖于python26因此不打算覆盖26.步骤如下: ...

  8. 使用 if 表达式

    由于 if 本质上是一个原函数,它的返回值就是满足条件分支表达式的值,因此,if 表达式也可以用作内联函数.我们以 check_positive( )为例进行说明.尽管条件表达式中不另写 return ...

  9. [OSG]OSG的相关扩展

    参考:osg官网 http://www.osgchina.org/index.php?view=article&id=176 http://trac.openscenegraph.org/pr ...

  10. 递归--练习3--noi7592求最大公约数问题

    递归--练习3--noi7592求最大公约数问题 一.心得 两个低级错误:1. ll setMax(ll &m,ll &n)中无引用,结果只传值,没传地址2. return f(n,m ...