angular - 没有任何声明模块的类型文件是否有意义?

标签 angular typescript typescript-typings definitelytyped gridstack

我正在尝试弄清楚如何在我的 Angular 项目中使用类型文件。但是所有指南或 SO 帖子似乎只告诉您将声明的模块导入到类型文件中。在我的例子 (gridstack.js) 中,它没有声明的模块,只有接口(interface)和一个声明的命名空间。

我已经在类型下的 tsconfig.file 中声明了 gridstack。我可以,例如声明一个 IGridstackOptions 类型的变量,没有编译器错误,但我收到一个运行时错误告诉我 C:/myPath/src/app/other-route/other-route.component.ts (16,60): 找不到名称“IGridstackOptions”。

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

谢谢 :)

最佳答案

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

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

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

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

declare namespace NodeJS
declare module "buffer"

第一个定义一个对象(命名空间,通常是全局的),而第二个定义一个模块。参见 here .

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

declare namespace GridStackUI

这也是在代码中完成的:

(function($, _) {

    var scope = window;
    ...

    return scope.GridStackUI;
});

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

declare const gridstack: GridStack;

但是,在 gridstack.js 中还有 UMD 模块定义,所以它可以像这样在模块支持环境中使用:

import * as gridstack from 'gridstack';

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

关于angular - 没有任何声明模块的类型文件是否有意义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46786370/

相关文章:

以对象作为数据源的 Angular Material 表

angular - 如何使用 Angular 2+ 中的单击事件动态创建按钮

javascript - 更新具有匹配属性的对象并忽略新属性

node.js - 输入 Angular 找不到名称错误

typescript - 在定义文件 (*d.ts) 中导入类

angular - 用于返回图像 URL Angular 6 的 Base64 版本的管道

javascript - 用户完成输入时的 Angular2 控件验证

angular - 从模板内的 Angular 2 类调用方法

typescript - 使用结构类型和变量重新分配来绕过对带有 "named parameters"的函数调用的类型检查

cordova - typescript 错误 : Cannot find name 'cordova'