首页 文章

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

提问于
浏览
0

我一直在使用TypeScript工作,我们使用RequireJS作为我的AMD加载器,并且它希望将我的一些个人JS库转换为TypeScript并且我想知道 - 是否可以使用TypeScript的内置模块系统来导出 global AND define 如果最终用户恰好使用require / amd?

我想避免破坏与现有用户的兼容性/强制他们进入Require .

我的现有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 回答

  • 1

    唯一的办法就是 not 使用typescript模块系统,它出现了 .

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

    为实现这一目标,他们必须遵循一套不为人知的(至少对我来说)规则:

    • 顶层没有 exportimport . 他们每个 export 都在 namespace ts { }

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

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

    为了使其可用作节点模块,它们在_1182144中具有以下代码:

    // 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 为你的模块做类似的事情 . 据我所知,目前没有内置支持 .

相关问题