这个打字稿:
export enum UID {
FACTORY,
ROBOT
}
编译到这个javascript:
(function (UID) {
UID._map = [];
UID._map[0] = "FACTORY";
UID.FACTORY = 0;
UID._map[1] = "ROBOT";
UID.ROBOT = 1;
})(exports.UID || (exports.UID = {}));
var UID = exports.UID;
我必须承认代码对我来说似乎相当模糊,但我相信tsc编译器知道它在做什么。不幸的是,javascript无法执行。 nodejs抱怨说:
(function(UID){
^ TypeError:object不是函数
at ...
我做错了什么?
更新: 马特B.解决了这个问题。这是typescript编译器中的已知错误。 tsc在require语句后无法插入分号,这可能会导致奇怪的错误。手动将分号添加到我的代码中解决了问题。这是codeplex问题的链接: http://typescript.codeplex.com/workitem/364
更新2: 对于那些遇到同样错误的人。您可以手动插入缺少的分号,但这不是一个非常舒服的解决方案,因为您必须在每次编译后执行此操作。我注意到问题只发生在enum上。项目中有许多其他模块,但没有一个模块导致此错误。显然,类定义不会被前面缺少的分号“伤害”。只需将枚举的定义移到一个类定义后面,错误就会消失。将枚举移到接口后面是不够的,因为接口没有直接的等价物,只是被编译器删除了
答案 0 :(得分:6)
我认为这与此处描述的问题相同 - 原因是require()
声明后缺少分号:
Typescript generating javascript that doesn't work
在另一个编译的文件中是否有这样的行?
var UID = require('UID')
如果是这样,请尝试在结尾添加分号:
var UID = require('UID');
这似乎是一个TypeScript错误;这是错误报告(投票!):http://typescript.codeplex.com/workitem/364
答案 1 :(得分:0)
在您的Javascript中,您应该有类似
的内容var exports = exports || {};
在
(function (UID) {
UID._map = [];
UID._map[0] = "FACTORY";
UID.FACTORY = 0;
UID._map[1] = "ROBOT";
UID.ROBOT = 1;
})(exports.UID || (exports.UID = {}));
var UID = exports.UID;
答案 2 :(得分:0)
我尝试了,但我遇到了同样的问题 - 我认为缺少的exports
变量应该由用于加载模块的JavaScript代码生成
import XXXX = module("XXXX");
生成此JavaScript:
var XXXX = require("./XXXX")
我觉得Matt B.是对的,问题是require()
之后缺少一个分号,之后会出现问题。
修复是将枚举声明放在模块中:
module Test {
export enum UID {
FACTORY,
ROBOT
}
}
生成:
var test;
(function (test) {
(function (UID) {
UID._map = [];
UID._map[0] = "FACTORY";
UID.FACTORY = 0;
UID._map[1] = "ROBOT";
UID.ROBOT = 1;
})(test.UID || (test.UID = {}));
var UID = test.UID;
})(test || (test = {}));
以这种方式不再需要exports
变量。