- 初識命名空間(namespace指令)
- 命名空間與文件拆分
- 多重命名空間與三斜杠指令引入依賴文件
一、初識命名空間(namespace指令)
TypeScript的命名空間可以說就是ES6的模塊化,其編譯的ES5代碼都是基於閉包將局部變量暴露給外部,作為外部一個對象的屬性提供給外部作用域使用。先來看一個最簡單的示例:
1 namespace MyMath{ //使用namespace指令聲明命名空間MyMath 2 //使用export指令暴露到作用域外部 3 export const PI = 3.14; 4 export function sumValue(num1:number, num2:number){ 5 return num1 + num2; 6 } 7 } 8 console.log(MyMath.PI);//在外部使用命名空間 9 console.log(MyMath.sumValue(2,3));
來看看上面命名空間ES5語法編譯的代碼:
1 var MyMath; 2 (function (MyMath) { 3 //使用export指令暴露到作用域外部 4 MyMath.PI = 3.14; 5 function sumValue(num1, num2) { 6 return num1 + num2; 7 } 8 MyMath.sumValue = sumValue; 9 })(MyMath || (MyMath = {})); 10 console.log(MyMath.PI); //在外部使用命名空間 11 console.log(MyMath.sumValue(2, 3));
二、命名空間與文件拆分
前面我們已經知道TypeScript命名空間就是將閉包內部的變量,通過暴露到外部以對象引用的方式給外部使用,當一個頁面基於多個Ts腳本文件時,能想到的第一個方法就是將各個Ts文件轉換的js文件依次引入到頁面就可以實現了。比如下面這個示例:
工作區間 index.html index.ts index.js//IDE自動轉換的腳本 a.ts a.js//IDE自動轉換的腳本 b.ts b.js//IDE自動轉換的腳本 tsconfig.json
然后將第一節中的示例代碼拆分到各個文件中:
1 //a.ts 2 namespace MyMath{ 3 export const PI = 3.14; 4 } 5 //b.ts 6 namespace MyMath{ 7 export function sumValue(num1:number, num2:number){ 8 return num1 + num2; 9 } 10 } 11 //index.ts--在這里使用命名空間的內容 12 console.log(MyMath.PI); 13 console.log(MyMath.sumValue(2,3)); 14 15 //index.html引入各個ts轉換的js腳本 16 <script src="./a.js"></script> 17 <script src="./b.js"></script> 18 <script src="./index.js"></script>
上面這種最暴力的方式顯然不能成為我們最想要的,TS當然也給我們提供了一個解決方案,通過IDE將所有ts轉碼到一個js腳本中,通過命令行工具outfile來實現:
tsc --outfile index.js a.ts b.ts index.ts
通過outfile命令將a.ts、b.ts、index.ts就可以統一轉碼打包到一個index.js文件中,然后index.html就只需要引入一個index.js文件就可以了。
但是這時候可能你還是會覺得不夠智能,你會想能不能像之前單個文件自動轉碼成一個js文件一樣,也將多個ts文件自動轉碼到一個js文件中呢?當然還是可以的,全自動化的轉碼需要基於模塊來實現,這篇博客不會涉及,但是除了上面這種轉碼模式,Ts還有一種使用引入依賴文件的方式來實現,詳細請看下一節內容解析。
三、多重命名空間與三斜杠指令引入依賴文件
在解析引入依賴之前,這里補充以下多重命名空間。多重命名空間簡單的說就是嵌套的命名空間,然后采用對象屬性節點層次依賴的方式來實現。在前面的示例基礎上來展示:
1 //a.ts 2 namespace MyMath{ 3 export const PI = 3.14; 4 export namespace MyMathA{ //使用多重命名空間 5 export const strA = "This is namespace a."; 6 } 7 } 8 //index.ts 9 console.log(MyMath.PI);//在外部使用命名空間 10 console.log(MyMath.sumValue(2,3)); 11 console.log(MyMath.MyMathA.strA);//引用多重命名空間的內容
然后在執行轉碼操作:
tsc --outfile index.js a.ts b.ts index.ts
接着來看使用外部文件引用的方式如何實現多文件統一轉碼:
1 //index.ts 2 ///<reference path="a.ts" /> //引入外部文件 3 ///<reference path="b.ts" /> //引入外部文件 4 5 console.log(MyMath.PI);//在外部使用命名空間 6 console.log(MyMath.sumValue(2,3)); 7 console.log(MyMath.MyMathA.strA);//引用多重命名空間的內容
通過“///<reference path="..." />”引入外部文件,這種引入外部文件的操作甚至可以引入jQuery庫,然后執行轉碼就相對比前面的轉碼方便一點點:
tsc index.ts --outFile index.js
使用引入外部文件統一轉碼的方式要注意指令outFile(注意大寫的F),然后引入的文件就不需要在執行轉碼指令的時候寫到命令中了,而只需要直接對index.js這個入口文件執行轉碼操作即可。(不過引入外部文件或者執行outfile打包時最好依次按照依賴順序書寫,不按照順序的方式我沒有測試過,不知道會不會有影響,但是這里我們需要考慮js是單線程的執行模式,所以以防轉碼失敗最好還是按照依賴順序來寫)。