没有任何声明模块的打字文件是否有意义?

时间:2017-10-17 09:03:18

标签: angular typescript typescript-typings definitelytyped gridstack

我正在试图弄清楚如何在我的Angular项目中使用打字文件。但是所有指南或SO帖子似乎只是告诉我们在typings文件中导入声明的模块。在我的情况下(gridstack.js),它没有声明的模块,只有接口和一个声明的命名空间。

我在类型下的tsconfig.file中声明了gridstack。我可以,例如声明类型IGridstackOptions的变量没有编译器错误,但是我收到运行时错误告诉我 C:/myPath/src/app/other-route/other-route.component.ts (16,60): Cannot find name 'IGridstackOptions'.

有人知道我做错了什么吗?没有声明的模块有一个打包文件是否有意义?如果是的话,你能解释一下这背后的原因吗?

谢谢:)

1 个答案:

答案 0 :(得分:1)

您可以通过两种方式在JavaScript中使用库:

  • 使用库全局对象
  • 导入库对象

直到最近,大多数图书馆主要使用第一种方法并添加了全局对象。例如,jQuery全局对象。现在,大多数库将其库打包为UMD模块,允许将库用作全局对象,或者如果代码在支持环境的模块中运行,则将其用作导入。

Typescript定义了两种可用于定义声明的方法:

declare namespace NodeJS
declare module "buffer"

第一个定义一个对象(名称空间,通常是全局),而第二个定义一个模块。请参阅here

gridstack库的typing文件定义了一个全局对象:

declare namespace GridStackUI

这也是代码中的内容:

(function($, _) {

    var scope = window;
    ...

    return scope.GridStackUI;
});

它可以在你的代码中使用:

declare const gridstack: GridStack;

但是,在gridstack.js内部还有UMD模块定义,因此它可以在模块支持环境中使用,如下所示:

import * as gridstack from 'gridstack';

但是,打字文件没有针对该用法的声明。