【TypeScript入门】TypeScript入门篇——命名空间
????????命名空間是程序設計者命名的內存區域,程序設計者根據需指定一些有名字的空間域,把一些全局實體分別存放到各個命名空間中,從而與其他全局實體分隔開。通俗的說,每個名字空間都是一個名字空間域,存放在名字空間域中的全局實體只在本空間域內有效。名字空間對全局實體加以域的限制,從而合理的解決命名沖突。
一、命名空間? ? ?
二、命名空間的作用
三、命名空間的定義
四、命名空間的嵌套
五、命名空間的別名
一、命名空間? ? ?
命名空間一個最明確的目的就是解決重名問題。假設這樣一種情況,當一個班上有兩個名叫小明的學生時,為了明確區分它們,我們在使用名字之外,不得不使用一些額外的信息,比如他們的姓(王小明,李小明),或者他們父母的名字等等。
????????命名空間定義了標識符的可見范圍,一個標識符可在多個名字空間中定義,它在不同名字空間中的含義是互不相干的。這樣,在一個新的名字空間中可定義任何標識符,它們不會與任何已有的標識符發生沖突,因為已有的定義都處于其他名字空間中。
關于術語的一點說明:?請務必注意一點,TypeScript 1.5里術語名已經發生了變化。 “內部模塊”現在稱做“命名空間”。 “外部模塊”現在則簡稱為“模塊”,這是為了與?ECMAScript 2015里的術語保持一致,(也就是說?module X {?相當于現在推薦的寫法?namespace X {)。
二、命名空間的作用
????????一個大型的工程往往是由若干個人獨立完成的,不同的人分別完成不同的部分,最后再組合成一個完整的程序。由于各個頭文件是由不同的人設計的,有可能在不同的頭文件中用了相同的名字來命名所定義的類或函數,這樣在程序中就會出現名字沖突。
????????名字沖突就是在同一個作用域中有兩個或多個同名的實體,為了解決命名沖突 ,C++中引入了命名空間,所謂命名空間就是一個可以由用戶自己定義的作用域,在不同的作用域中可以定義相同名字的變量,互不干擾,系統能夠區分它們。
三、命名空間的定義
TypeScript 中命名空間使用?namespace?來定義,語法格式如下:
namespace SomeNameSpaceName { export interface ISomeInterfaceName { } export class SomeClassName { } }以上定義了一個命名空間 SomeNameSpaceName,如果我們需要在外部可以調用 SomeNameSpaceName 中的類和接口,則需要在類和接口添加?export?關鍵字。
要在另外一個命名空間調用語法格式為:
SomeNameSpaceName.SomeClassName;如果一個命名空間在一個單獨的 TypeScript 文件中,則應使用三斜杠 /// 引用它,語法格式如下:?
/// <reference path = "SomeFileName.ts" />?
以下實例演示了命名空間的使用,定義在不同文件中:
IShape.ts 文件代碼: namespace Drawing { export interface IShape { draw(); } } Circle.ts 文件代碼: /// <reference path = "IShape.ts" /> namespace Drawing { export class Circle implements IShape { public draw() { console.log("Circle is drawn"); } } } TestShape.ts 文件代碼: /// <reference path = "IShape.ts" /> /// <reference path = "Circle.ts" /> /// <reference path = "Triangle.ts" /> function drawAllShapes(shape:Drawing.IShape) { shape.draw(); } drawAllShapes(new Drawing.Circle()); drawAllShapes(new Drawing.Triangle());使用 tsc 命令編譯以上代碼:?
tsc --out app.js TestShape.ts得到以下 JavaScript 代碼:
/// <reference path = "IShape.ts" /> var Drawing; (function (Drawing) {var Circle = /** @class */ (function () {function Circle() {}Circle.prototype.draw = function () {console.log("Circle is drawn");};return Circle;}());Drawing.Circle = Circle; })(Drawing || (Drawing = {})); /// <reference path = "IShape.ts" /> var Drawing; (function (Drawing) {var Triangle = /** @class */ (function () {function Triangle() {}Triangle.prototype.draw = function () {console.log("Triangle is drawn");};return Triangle;}());Drawing.Triangle = Triangle; })(Drawing || (Drawing = {})); /// <reference path = "IShape.ts" /> /// <reference path = "Circle.ts" /> /// <reference path = "Triangle.ts" /> function drawAllShapes(shape) {shape.draw(); } drawAllShapes(new Drawing.Circle()); drawAllShapes(new Drawing.Triangle());使用 node 命令查看輸出結果為:
$ node app.js
Circle is drawn
Triangle is drawn
四、命名空間的嵌套
命名空間支持嵌套,即你可以將命名空間定義在另外一個命名空間里頭。
namespace namespace_name1 { export namespace namespace_name2 {export class class_name { } } }?成員的訪問使用點號?.?來實現,如下實例:
Invoice.ts 文件代碼: namespace Runoob { export namespace invoiceApp { export class Invoice { public calculateDiscount(price: number) { return price * .40; } } } } InvoiceTest.ts 文件代碼: /// <reference path = "Invoice.ts" /> var invoice = new Runoob.invoiceApp.Invoice(); console.log(invoice.calculateDiscount(500));使用 tsc 命令編譯以上代碼:
tsc --out app.js InvoiceTest.ts得到以下 JavaScript 代碼:
var Runoob; (function (Runoob) {var invoiceApp;(function (invoiceApp) {var Invoice = /** @class */ (function () {function Invoice() {}Invoice.prototype.calculateDiscount = function (price) {return price * .40;};return Invoice;}());invoiceApp.Invoice = Invoice;})(invoiceApp = Runoob.invoiceApp || (Runoob.invoiceApp = {})); })(Runoob || (Runoob = {})); /// <reference path = "Invoice.ts" /> var invoice = new Runoob.invoiceApp.Invoice(); console.log(invoice.calculateDiscount(500));使用 node 命令查看輸出結果為:
$ node app.js
200
五、命名空間的別名
在引用命名空間時,可以通過import關鍵字起一個別名
biology.tsnamespace Biology {export interface Animal {name: string;eat(): void;}} /// <reference path="biology.ts" />import bio_other = Biology; // 別名????????在 typescript 中,為了避免對全局的污染,可以使用命名空間, 在模塊化被廣泛使用后,命名空間就很少被使用了。
總結
以上是生活随笔為你收集整理的【TypeScript入门】TypeScript入门篇——命名空间的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关乎爱情与无关爱情--由阿里上市想到的
- 下一篇: 【腾讯云IM】即时通讯的登录,登出,用户