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'.

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

谢谢 :)

4

1 回答 1

1

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

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

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

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

declare namespace NodeJS
declare module "buffer"

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

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

declare namespace GridStackUI

这也是代码内部所做的:

(function($, _) {

    var scope = window;
    ...

    return scope.GridStackUI;
});

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

declare const gridstack: GridStack;

但是,里面gridstack.js也有 UMD 模块定义,所以它可以在模块支持环境中使用,如下所示:

import * as gridstack from 'gridstack';

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

于 2017-10-18T05:51:33.267 回答