1. 程式人生 > >關於TypeScript中的module和export關鍵詞

關於TypeScript中的module和export關鍵詞

我們在使用egret的時候,呼叫egret中的類都是要加上egret.XXX或者egret.gui.XXX的。 這是為何呢?仔細看一下egret的原始碼會發現, egret中的定義的所有類都是這樣的格式

  1. module egret {
  2.     export class XXX {
  3.     }
  4. }

假如是gui模組,那麼原始碼中的類module後面的就是egret.gui。 RES模組中的類module是RES。那麼這裡的關鍵詞module到底是幹嘛的?


module大致的意思就是模組, 一個模組中有若干類,假如我寫了兩個類都叫 A 。那怎麼區分呢,那麼就使用這個module關鍵詞將這兩個類定義在不同模組就行了。module還有一個作用也是主要作用就是將一些不同特徵的的類區分開。 比如 egret裡面有幾大模組,核心模組叫 egret , gui模組叫 egret.gui,RES模組就叫RES , dragonBones模組叫dragonBones。 這些模組就是按功能劃分的,一個模組負責一些特定的功能。

再比較一下as3中package關鍵詞與module的不同。as3中一般一個類在哪個資料夾下,那這個類的package就是這個相對於src資料夾的名字,這樣就不用擔心不同資料夾下有名稱相同的類而無法區分了。ts中module與類所在的資料夾無關,可能不同資料夾下的類都是一個module,一個資料夾下的類是不同module(這種情況最好不要出現)。 從某種角度來說,module的概念包括了package。你完全可以把某一個資料夾下的類定義的module定義成相對於src資料夾的名字就和as3的package是一樣的。不過不推薦這種做法,這樣會書寫不便,引用每一個類都要加上module名字首。


回過來解釋為什麼我們要加上egret.XXX來呼叫egret裡面的類。 因為通常情況下,我們定義類都是這樣寫的

  1. class XXX {
  2. }

我們不會為自己的遊戲所寫的類加上module這個關鍵詞,所以我們通常使用的是預設模組,這樣就和egret不在一個模組了,所以要呼叫egret中類就要加上egret.XXX。

在一個module下的不同類之間的相互呼叫不需要加模組名。比如 egret這個模組中有很多類但是在egret的原始碼中你幾乎看不到egret.XXX這樣的呼叫,因為他們都是在一個模組下。 同理假如你寫了個類module是egret,那這個類呼叫egret裡面的類也不需要加egret字首了。但是不建議這樣做,因為模組的核心用法就是定義一組相同特徵的類。

子模組定義。我們可以檢視egret中GUI的原始碼,發現GUI中的類module名都是egret.gui。這個gui就是egret的子模組了。 在子模組中呼叫父模組的類也是不需要加字首的。比如egret.gui中的類呼叫egret中的類是不需要加egret字首的。 在父模組中呼叫子模組只需要加上相對於父模組的模組名就行了。比如egret中的類呼叫egret.gui中的類使用gui.XXX。

關於export的用法

。 在使用module時定義一個類需要在前面加上export關鍵詞。表示在這個模組中匯入了這個類(在預設模組下不需要加export)。也可以不加但是不加的話這個類是無法在這個檔案外部訪問的,相當與內部類。另外export還可以用於function。這些用法的一個典型的例子就是RES模組中, 我們通常會使用RES.getRes(XXX)來獲取資源,好像這是一個叫RES類的靜態方法,其實不然。搜尋下發現根本就沒有RES這個類,RES是模組名,getRes是RES模組下的一個方法。程式碼在Resource.ts檔案中,如下:

  1.     export function getRes(key:string):any{
  2.         return instance.getRes(key);
  3.     }

所以export也可以用於匯入方法。同理 egret.setTimeout這類的方法都是使用export匯入的方法 。再來看上述例子中的 instance 實際上是Resource這個類的一個例項,只不過這個類是一個內部類。可以看到在Resource.ts是這樣定義的

  1. class Resource extends egret.EventDispatcher{
  2. }

這裡沒用使用export關鍵詞,這樣外界就無法訪問這個類,這個類只在內部使用很好的封裝起來了。這是一個很好的用法。


總之module就是定義了一組相同特徵的類。在官方Egret的1.0.3版本中將GUI中的類全部改為egret.gui.XXX,這個改變看似很無理,本來一個按鈕是egret.Button這樣寫,但是要改成egret.gui.Button,書寫不便了。但是這樣是合理的,就是因為這是一個單獨的模組。需要從egret模組中隔離出來。 以上就是module的主要用法了。