Typescript生成的JavaScript有一个不是函数的函数

这个打字稿:

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抱怨说:

(函数(UID){

^ TypeError:对象不是一个函数

 at ... 

我做错了什么?

更新:马特B.已经解决了这个问题。 这是打字稿编译器中的一个已知的错误。 tsc在require语句后无法插入分号,这可能导致奇怪的错误。 手动将分号添加到我的代码解决了问题。 以下是codeplex问题的链接: http : //typescript.codeplex.com/workitem/364

更新2:对于那些遇到同样错误的人。 您可以手动插入缺less的分号,但这不是一个非常舒适的解决scheme,因为您必须在每次编译之后执行此操作。 我注意到问题只发生在枚举。 项目中还有很多其他的模块,并没有导致这个错误。 显然,类定义并没有被它前面缺less的分号“伤害”。 只要移动你的类定义之后的枚举的定义,错误应该消失。 将枚举移动到接口后面是不够的,因为接口没有直接的等价物,只是被编译器删除

我认为这是和这里描述的相同的问题 – 原因是require()语句后缺less分号:

生成JavaScript的Typescript不起作用

在另一个编译的文件中是否有这样的一行?

var UID = require('UID')

如果是这样,请尝试在末尾添加分号:

var UID = require('UID');

这似乎是一个TypeScript错误; 这里的错误报告(投票!): http : //typescript.codeplex.com/workitem/364

在你的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; 

我试过了,我也遇到了同样的问题 – 我假定在你做的时候,用于加载模块的JavaScript代码会生成缺less的exportsvariables

 import XXXX = module("XXXX"); 

生成这个JavaScript:

 var XXXX = require("./XXXX") 

而且我认为Matt B.是正确的,并且在require()之后还存在缺less的分号,这会导致事后混淆。

解决方法是将枚举声明放在模块中:

 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 = {})); 

通过这种方式,不再需要exportsvariables。