为了找到一个不那么丑陋的解决方案,我发现我可以告诉Typescript从本地范围导出变量作为模块的一部分。但有些事情很奇怪,我想在下面的小例子中向您展示。
假设我在同一目录中有以下三个文件。
class Red {}
class Blue {}
/// <reference path="Blue"/>
/// <reference path="Red"/>
export var Red = Red;
export var Blue = Blue;
当我构建一个客户端模块时,我使用AMD作为模块格式,从Typescript获取以下Javascript输出。
var Blue = (function () {
function Blue() {
}
return Blue;
}());
var Red = (function () {
function Red() {
}
return Red;
}());
define("colors", ["require", "exports"], function (require, exports) {
"use strict";
exports.Red = exports.Red; // this just assigns undefined
exports.Blue = exports.Blue; // his just assigns undefined
});
我尝试使用:
export var Red;
export var Blue;
但在那种情况下,Typescript根本不会为这些语句生成任何代码。
我实际上喜欢它来生成以下导出语句:
exports.Red = Red;
exports.Blue = Blue;
我知道我可以暂时重命名变量,如:
var Red_ = Red;
var Blue_ = Blue;
export Red = Red_;
export Blue = Blue_;
或者也可以在带有地图和东西的循环中进行,但是这样做的正确方法是什么?
因此,为了更容易,请从以下选择一个或多个问题:
我不能选择自己导出类( Red.ts 中的export class Red ...
和 Blue.ts 分别导出),然后像Aluan Haddad描述的clientside module bundle problem那样在 colors.ts 中重新导出它们,因为我不希望任何类获得一个define-statement来保持一个干净的全局环境。
目的是能够要求结果(colors.js
)并让一个对象授予对整体某些部分的访问权限。 作为编写Typescript后的第二步,我将整个脚本包含在一个函数中,以便所有全局变量都变为本地变量,只有define语句将定义整个脚本功能的接口。 < / p>
答案 0 :(得分:1)
问题在于您正在混合全局代码和模块代码。 “引用路径”构造用于使用在其他文件中声明的全局变量。 虽然这在您的情况下似乎是偶然的,但通常尽可能避免混合使用全局代码和模块代码。
请尝试以下
<强> red.ts 强>
export class Red {}
<强> blue.ts 强>
export class Blue {}
<强> colors.ts 强>
export {Red} from './red';
export {Blue} from './blue';
详细说明,文件不是模块,除非它们包含顶级import
或export
语句。由于红色和蓝色文件未导入或导出任何内容,因此只是定义全局变量。