Javascript 使用TypeScript中的外部模块声明全局变量

Javascript 使用TypeScript中的外部模块声明全局变量,javascript,node.js,typescript,typescript1.7,Javascript,Node.js,Typescript,Typescript1.7,我正在用TypeScript编写一个npm模块。该模块可以在NodeJ中使用(通过使用require),也可以从浏览器中使用(通过在浏览器中加载node\u modules/html2commonmark/dist/client/bundle.js) 我最近添加了*.d.ts文件,以便在使用“moduleResolution”:“node”时获得键入信息。这非常有效,当安装我的模块时,它就可以在typescript中使用了。因此:下面的typescript代码编译时没有错误: // After

我正在用TypeScript编写一个npm模块。该模块可以在NodeJ中使用(通过使用
require
),也可以从浏览器中使用(通过在浏览器中加载
node\u modules/html2commonmark/dist/client/bundle.js

我最近添加了*.d.ts文件,以便在使用
“moduleResolution”:“node”
时获得键入信息。这非常有效,当安装我的模块时,它就可以在typescript中使用了。因此:下面的typescript代码编译时没有错误:

// After installing using npm install html2commonmark
// using "moduleResolution": "node"
import * as html2commonmark from 'html2commonmark';
let converter = new html2commonmark.JSDomConverter();
漂亮

现在我想在浏览器中运行我的模块。如前所述,我需要在index.html页面的
节点/html2commonmark/dist/client/bundle.js中添加一个脚本标记。之后,html2commonmark全局变量应该可用。问题是:如何让typescript编译知道全局变量在那里?以下TS代码无法编译:

let converter = new html2commonmark.BrowserConverter(); 
// error TS2304: Cannot find name 'html2commonmark'.
即使我添加了一个global.d.ts文件,我似乎也不能同时导入我的外部模块和声明我的全局变量:

// Something like this does not work :(
import * as b from 'html2commonmark';
declare var html2commonmark: typeof b;
我明白这是为什么。通过使用导入关键字,我的ts文件被转换为外部模块,因此需要导入。但我觉得我的情况很普遍。即:一个npm模块,包含npm组件和用于浏览器的捆绑包,该捆绑包将功能公开为全局变量


是否有任何方法可以使用外部模块中的定义来声明全局变量?我不想把我的api重写为(DefinitelyTyped样式)名称空间,而我只是用TS编写了我的全部源代码

编写同时在浏览器和Node.js中工作的外部模块的正确方法是:

  • 使用
    --模块umd
    标志,然后在浏览器中使用AMD加载程序加载模块
  • 使用
    --module commonjs
    标志,然后使用像webpack或browserify这样的捆绑包

  • 换句话说,当您开始编写模块化代码时,盲目地将
    标记添加到HTML文件不再是将代码加载到浏览器中的正确方法。正如您不应该在Node.js中触摸全局范围一样,您也不应该在浏览器中触摸全局范围。你可以用
    if(typeof window!=“undefined”)(.

    谢谢你的回复!为了生成bundle.js,我使用的是webpack。当然,我也可以强制(typescript)为浏览器编写的用户使用webpack/browserify。我只是想知道是否有更好的方法。我觉得这应该是可能的。使用
    (window).global=yourObject
    是不需要的,因为该对象已经在全局范围内可用(至少:当您的页面上包含bundje.js时)。我只是想找到一种方法使它对typescript可见。在这种情况下,答案是简单得多的“否”:您可以通过
    声明模块“foo”{export=SomeGlobal;}
    将全局接口公开给手工编写的d.ts文件中的命名模块,但是没有其他方法。这太糟糕了。如果你用简短的版本更新你的答案,我会把它标记为正确的答案你是我的英雄:
    If(typeof window!=“undefined”)(window.global=yourObject;-)