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

    相关问题