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的exports
variables
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 = {}));
通过这种方式,不再需要exports
variables。