在全局命名空間中定義的子產品就是全局子產品,示例:
以上這種方式編譯是通過的,因為foo在全局命名空間中,是以其他任何檔案都可以引用foo。顯然這是危險行為。
檔案子產品也被稱為外部子產品,當我們使用import/export導入導出子產品時,他會在目前檔案中建立一個本地作用域。
js子產品系統有多種實作方式,常見的規範有<code>commonjs, amd, es modules</code>,amd它僅能在浏覽器工作,esmodule目前存在浏覽器相容問題,是以更推薦使用node推出的commonjs規範。
在ts中設定<code>module:commonjs</code>,可以讓我們像使用es modules一樣使用commonjs。
import導入支援相對路徑和絕對路徑,相對路徑比較簡單不做過多解釋,絕對路徑的查找順序是下面這樣的:
當你使用 import * as foo from 'foo',将會按如下順序查找子產品:
./node_modules/foo
../node_modules/foo
../../node_modules/foo
直到系統的根目錄
當你使用 import * as foo from 'something/foo',将會按照如下順序查找内容
./node_modules/something/foo
../node_modules/something/foo
../../node_modules/something/foo
place解釋了子產品查找的方式,具體如下:
如果place是一個檔案,并且存在foo.ts,命中
如果place是一個檔案夾,并且存在foo/index.ts,命中
如果place是一個檔案夾,并且存在foo/package.json,并且檔案中指定的types檔案存在,命中
如果place是一個檔案夾,并且存在package.json,并且檔案中指定的main檔案存在,命中
上面place介紹的查找方式,是可以人為修改的。我們可以定義一個<code>global.d.ts</code>檔案,修改它的查找位置。
global.d.ts 檔案,用來将一些接口或者類型放入全局命名空間裡,這些定義的接口和類型能在你的所有 typescript 代碼裡使用。對于一些新手和沒有聲明的第三方庫可以使用global.d.ts避免報錯。
上面這行代碼做了兩件事:第一是導入foo 子產品的所有類型資訊,二是确定 foo 子產品運作時的依賴關系。
如果沒有foo當作變量聲明空間使用,那麼編譯成js時候上面的導入代碼會被自動移除。
常用網站:
segmentfault |
github |
掘金社群