没有任何声明模块的打印文件是否有意义?
问题描述:
我想弄清楚如何在我的Angular项目中使用类型文件。但是,所有的指南或SO帖子似乎都只是告诉您将代码文件中声明的模块导入。在我的情况下(gridstack.js)它没有声明的模块,只有接口和一个声明的命名空间。没有任何声明模块的打印文件是否有意义?
我已经在类型下的tsconfig.file中声明了gridstack。我可以例如声明没有编译器错误类型IGridstackOptions
的变量,但我得到一个运行时错误告诉我 C:/myPath/src/app/other-route/other-route.component.ts (16,60): Cannot find name 'IGridstackOptions'.
有谁知道我做错了吗?有没有声明模块的类型文件是否有意义?如果是的话,你能解释一下这个背后的推理吗?
谢谢:)
答
导入库对象
可以使用在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';
但分型的文件不具有该用途的声明。
很好的解释@AngularInDepth!但是,编译器告诉我GridstackUI在类型窗口上不存在。在设计方面,它不是为了在角度上使用窗口而皱起眉头,但这也许是唯一的方法吗? – Beese
使用下面的'声明const gridstack:GridStack;',我更新了我的答案 –
太棒了!正是我需要的,非常感谢你,你的回答非常感谢:) – Beese