我一直在使用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 回答
唯一的办法就是 not 使用typescript模块系统,它出现了 .
Typescript编译器本身就是一个很好的例子 -
lib/tsc.js
既可以用作节点模块,也可以用作全局脚本 .为实现这一目标,他们必须遵循一套不为人知的(至少对我来说)规则:
顶层没有
export
或import
. 他们每个export
都在namespace ts { }
内一个文件可以使用另一个文件中的符号,前提是每个文件的所有内容都在
namespace ts { }
中 . 您必须确保所有相互依赖的文件一起编译,或具有适当的/// <reference
指令 . 这假定您使用--outFile
选项从多个打字稿文件生成单个输出文件 .实质上,您正在创建一个由所有文件组成的巨型全局脚本,其中包含名称空间
ts
内的所有内容 . 结果输出将在顶层具有var ts
,如果将其作为普通脚本包含在内,它将变为全局 .为了使其可用作节点模块,它们在_1182144中具有以下代码:
你必须使用
define
而不是module
为你的模块做类似的事情 . 据我所知,目前没有内置支持 .