【问题标题】:Does a typings file without any declared modules make sense?没有任何声明模块的类型文件是否有意义?
【发布时间】:2018-03-28 22:08:15
【问题描述】:

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

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

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

谢谢:)

【问题讨论】:

    标签: angular typescript typescript-typings definitelytyped gridstack


    【解决方案1】:

    您可以通过两种方式在 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';
    

    但类型文件没有该用法的声明。

    【讨论】:

    • 很好的解释@AngularInDepth!但是,编译器告诉我 GridstackUI 在类型窗口上不存在。从设计角度来说,在 Angular 中使用窗口是不是很不赞成,但这可能是唯一的方法吗?
    • 使用下面的declare const gridstack: GridStack;,我更新了我的答案
    • 太棒了!正是我所需要的,非常感谢,非常感谢您的回答:)
    • @Beese,很高兴我能帮上忙 :) 祝你好运
    猜你喜欢
    • 2021-09-28
    • 1970-01-01
    • 1970-01-01
    • 2013-01-14
    • 1970-01-01
    • 1970-01-01
    • 2020-03-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多