angular - 一個沒有聲明任何模塊的 typings 文件有意義嗎?
我正在嘗試弄清楚如何在我的 Angular 專案中使用 typings 文件。但是所有的指南或 Stack Overflow 帖子似乎都只是說要在 typings 文件中導入已聲明的模塊。在我的情況(gridstack.js)中,它沒有已聲明的模塊,只有接口和一個已聲明的命名空間。
我已經在 tsconfig.file 的 types 下宣告了 gridstack。而且例如,我可以宣告一個類型為 IGridstackOptions 的變數而不會有編譯器錯誤,但我在執行時會得到錯誤,告訴我 C:/myPath/src/app/other-route/other-route.component.ts (16,60): 無法找到名稱 'IGridstackOptions'。
有人知道我哪裡做錯了嗎?而且有一個沒有聲明模組的 typings 檔案是否合理?如果合理,能解釋背後的原因嗎?
謝謝 :)
答案#1
你可以用兩種方式在 JavaScript 中使用一個函式庫:
- 使用全域物件庫
- 導入庫物件
直到最近,大多數程式庫主要使用第一種方法並添加全域物件。例如,jQuery 全域物件。如今,大多數程式庫將它們的程式庫打包為 UMD 模組,允許在程式碼運行於支援模組的環境中時,將程式庫作為全域物件或作為匯入使用。
Typescript 定義了兩種可用來定義聲明的方法:
declare namespace NodeJS
declare module "buffer"
第一個定義了一個物件(命名空間,通常是全域的),而第二個定義了一個模組。看這裡。
gridstack 函式庫的 typings 檔案定義了一個全域物件:
declare namespace GridStackUI
而這也是程式碼內所做的事情:
(function($, _) {
var scope = window;
...
return scope.GridStackUI;
});
它可以在你的程式碼中這樣使用:
declare const gridstack: GridStack;
然而,在 gridstack.js 內部也有 UMD 模組定義,因此它可以在支持模組的環境中這樣使用:
import * as gridstack from 'gridstack';
但 typings 檔案沒有針對那種用法的聲明。
