我一直在使用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 定义全局...
我已经尝试并消除了出口,一起出口全球,但当然不再定义。非常感谢任何帮助。
答案 0 :(得分:1)
这样做的唯一方法是不使用typescript模块系统,它会出现。
Typescript编译器本身就是一个很好的例子 - lib/tsc.js
可以用作节点模块和全局脚本。
为实现这一目标,他们必须遵循一套众所周知的(至少对我而言)规则:
顶层没有export
或import
。他们拥有的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
为您的模块执行类似操作。据我所知,目前没有内置的支持。