导出全局并通过TypeScript模块系统定义?

时间:2016-12-07 23:08:27

标签: typescript requirejs

我一直在使用TypeScript工作,我们使用RequireJS作为我们的AMD加载器,并且它运行得很好。我想将我的一些个人JS库转换为TypeScript,我想知道 - 是否可以使用TypeScript的内置模块系统来导出全局 AND 定义使用require / amd,如果最终用户正好使用它?

我希望避免破坏与现有用户的兼容性/强制他们进入“需要”。

My Existing JS文件的布局是这样的,它定义了一个全局AND,如果定义了define,定义了TickerGraph:

var TickerGraph = (function () { …class code… });

if( typeof define == "function" ) {
    define([], function() {
        return TickerGraph;
    });
}

在我的TypeScript重写中,我已将其定义为定义为UMD的模块类型,如下所示:

export = class TickerGraph { …class code… }

输出

(function (dependencies, factory) {
    if (typeof module === 'object' && typeof module.exports === 'object') {
        var v = factory(require, exports); if (v !== undefined) module.exports = v;
    }
    else if (typeof define === 'function' && define.amd) {
        define(dependencies, factory);
    }
})(["require", "exports"], function (require, exports) {
    "use strict";
    return (function () {

哪些检查定义/导出,但 NOT 定义全局...

我已经尝试并消除了出口,一起出口全球,但当然不再定义。非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

这样做的唯一方法是使用typescript模块系统,它会出现。

Typescript编译器本身就是一个很好的例子 - lib/tsc.js可以用作节点模块和全局脚本。

为实现这一目标,他们必须遵循一套众所周知的(至少对我而言)规则:

  • 顶层没有exportimport。他们拥有的export每个namespace ts { }

  • 一个文件可以使用其他文件中的符号,前提是每个文件的所有内容都在namespace ts { }中。您必须确保所有相互依赖的文件一起编译,或具有适当的/// <reference指令。这假设您使用--outFile选项从多个打字稿文件生成单个输出文件。

实质上,您正在创建一个由所有文件组成的巨型全局脚本,其中包含名称空间ts内的所有内容。结果输出将在顶层具有var ts,如果将其作为普通脚本包含,它将变为全局。

为了使其可用作节点模块,他们在shims.ts中使用此代码:

// Here we expose the TypeScript services as an external module
// so that it may be consumed easily like a node module.
declare var module: any;
if (typeof module !== "undefined" && module.exports) {
    module.exports = ts;
}

您必须使用define代替module为您的模块执行类似操作。据我所知,目前没有内置的支持。