我們看個具體的例子。下面這個使用 TypeScript 編寫的 SAP UI5 Component:
import UIComponent from "sap/ui/core/UIComponent";
/**
* @namespace ui5.typescript.helloworld
*/
export default class Component extends UIComponent {
public multiply(x : number, y : number) : number {
return x * y;
}
}
第一行 import 的 UIComponent,其型別定義從哪裡來?
我們如果對著 "sap/ui/core/UIComponent" 單擊滑鼠左鍵,就會看到一個 declare module 的宣告。
單擊之後,在 node_modules 資料夾下的 @types 資料夾的 openui5 下面,能找到一個 sap.ui.core.d.ts 檔案:
這就是所謂的 DefinitelyTyped 外部型別定義檔案。
UI5 for TypeScript 的外部型別定義檔案的安裝方式:
npm install --save @types/openui5
地址:https://github.com/Definitely...
這些外部定義都是從 OpenUI5 JSDoc 生成的。 如果出現問題,需要修復原始 OpenUI5 儲存庫中的生成器或 JSDoc,而不是此儲存庫中的定義檔案。
OpenUI5 型別定義在兩個 npm 包名下發布:
- @openui5/ts-types-esm(由 UI5 開發團隊直接釋出)
- @types/openui5(通過 DefinitelyTyped 維護的)
二者的差異:
- 對於@openui5/ts-types-esm 上的那些型別定義,每當釋出 OpenUI5 的新補丁版本時,都會釋出一個新補丁版本。即使型別定義沒有變化。這意味著程式碼和型別定義在使用完全相同的版本時完全同步。
然而,對於 @types/openui5,DefinitelyTyped 採用了definitelyTyped 的版本控制方法:
只有主要和次要版本號在庫包和型別宣告包之間對齊。
型別宣告包的補丁版本與庫補丁版本無關。
這背後的原因是,使用語義版本控制,對於相同主要/次要版本的所有補丁版本,API 將保持不變。例如:OpenUI5 1.90.0 和 OpenUI5 1.90.8 之間沒有 API 變化。因此,無需為 OpenUI5 1.90.8(以及 1.90.7、1.90.6 等)釋出新的型別定義。
唯一的例外是,當文件或定義生成器中存在重大改進或修復時,我們仍可能在 DefinitiveTyped 上建立新的補丁版本。
更多Jerry的原創文章,盡在:"汪子熙":