3

我想弄清楚如何在我的Angular項目中使用類型文件。但是,所有的指南或SO帖子似乎都只是告訴您將代碼文件中聲明的模塊導入。在我的情況下(gridstack.js)它沒有聲明的模塊,只有接口和一個聲明的命名空間。沒有任何聲明模塊的打印文件是否有意義?

我已經在類型下的tsconfig.file中聲明瞭gridstack。我可以例如聲明沒有編譯器錯誤類型IGridstackOptions的變量,但我得到一個運行時錯誤告訴我 C:/myPath/src/app/other-route/other-route.component.ts (16,60): Cannot find name 'IGridstackOptions'.

有誰知道我做錯了嗎?有沒有聲明模塊的類型文件是否有意義?如果是的話,你能解釋一下這個背後的推理嗎?

謝謝:)

回答

1

可以使用在JavaScript庫有兩種方式:使用庫全局對象

  • 導入庫對象
  • 直到最近,主要是多數圖書館

    • 使用第一種方法並添加全局對象。例如,jQuery全局對象。現在,大多數庫將它們的庫打包爲UMD模塊,允許將庫用作全局對象,或者如果代碼在模塊支持環境中運行,則作爲導入。

      打字稿定義了兩種方法可用於定義聲明:

      declare namespace NodeJS 
      declare module "buffer" 
      

      第一個定義了一個對象(命名空間,通常是全局的),而第二個定義的模塊。請參閱here

      gridstack庫的分型文件定義一個全局對象:

      declare namespace GridStackUI 
      

      ,這也是什麼裏面的代碼完成:

      (function($, _) { 
      
          var scope = window; 
          ... 
      
          return scope.GridStackUI; 
      }); 
      

      ,它可以在你的代碼中使用像這個:

      declare const gridstack: GridStack; 
      

      但是,在gridstack.js裏面, E公司還UMD模塊定義,因此它可以在模塊支撐環境這樣使用:

      import * as gridstack from 'gridstack'; 
      

      但分型的文件不具有該用途的聲明。

    +0

    很好的解釋@AngularInDepth!但是,編譯器告訴我GridstackUI在類型窗口上不存在。在設計方面,它不是爲了在角度上使用窗口而皺起眉頭,但這也許是唯一的方法嗎? – Beese

    +0

    使用下面的'聲明const gridstack:GridStack;',我更新了我的答案 –

    +0

    太棒了!正是我需要的,非常感謝你,你的回答非常感謝:) – Beese

    相關問題