如何建立高質量的TypeScript宣告檔案(四)
繼續上篇文章[ofollow,noindex">如何建立高質量的TypeScript宣告檔案(三) ]
對UMD庫的依賴性
來自全域性庫
如果您的全域性庫依賴於UMD模組,請使用/// <reference types指令
:
/// <reference types="moment" /> function getThing(): moment;
來自模組或UMD庫
如果您的模組或UMD庫依賴於UMD庫,請使用import語句:
import * as someLib from 'someLib';
不要使用/// <reference指令
宣告對UMD庫的依賴!
補充說明
防止名稱衝突
請注意,在編寫全域性宣告檔案時,可以在全域性範圍中定義許多型別。 我們強烈反對這一點,因為當許多宣告檔案在專案中時,它會導致可能無法解析的名稱衝突。
一個簡單的規則是僅通過庫定義的任何全域性變數宣告名稱空間型別。 例如,如果庫定義全域性值'cats',您應該寫
declare namespace cats { interface KittySettings { } }
而不是
// at top-level interface CatsKittySettings { }
還可以確保在不破壞宣告檔案使用者的情況下將庫轉換為UMD。
ES6對模組外掛的影響
某些外掛在現有模組上新增或修改頂級匯出。 雖然這在CommonJS和其他載入器中是合法的,但ES6模組被認為是不可變的,並且這種模式是不可能的。 因為TypeScript與載入程式無關,所以沒有編譯時強制執行此策略,但是打算轉換到ES6模組載入程式的開發人員應該知道這一點。
ES6對模組呼叫簽名的影響
許多流行的庫(如Express)在匯入時將自身暴露為可呼叫函式。 例如,典型的Express用法如下所示:
import exp = require("express"); var app = exp();
在ES6模組載入器中,頂級物件(此處匯入為exp)只能具有屬性; 頂級模組物件永遠不可呼叫。 這裡最常見的解決方案是為可呼叫/可構造物件定義預設匯出; 某些模組載入程式填充程式將自動檢測此情況並使用預設匯出替換頂級物件。