2013-03-06 26 views
1

这打字稿:打字稿生成的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抱怨:

(function (UID) {

^ TypeError: object is not a function

at ... 

我做了什么错了?

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

更新2: 对于那些你遇到同样的错误。您可以手动插入缺少的分号,但这不是一个很舒服的解决方案,因为您必须在每次编译后执行此操作。我注意到问题只发生在枚举上。项目中还有很多其他模块,它们都没有引起这个错误。显然,类定义并没有被它前面缺少的分号“伤害”。只要移动你的类定义后面的枚举定义,错误就会消失。这不是足以使枚举的接口后,因为接口没有直接等同,只是由编译器

+2

这是整个剧本吗? – Bergi 2013-03-06 16:57:05

+3

第二个')'(在你的错误信息中)不应该在那里:'(function(UID)){'。代码部分工作正常:http://jsfiddle.net/antisanity/cRNeN/ – canon 2013-03-06 16:59:22

+0

该代码适用于我。 – Pointy 2013-03-06 17:00:48

回答

6

我认为这与此处所述的问题相同 - 原因是require()声明后缺少分号:

Typescript generating javascript that doesn't work

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

var UID = require('UID')

如果是的话,尽量在最后添加一个分号:

var UID = require('UID');

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

+0

是的,解决了这个问题。谢谢您的回答。我在codeplex上也提出了这个问题 – lhk 2013-03-06 17:33:06

+1

如果其他人也希望upvote错误报告,这里的链接:http://typescript.codeplex.com/workitem/364 – 2013-03-06 17:33:45

+0

不错,我会添加链接到问题 – lhk 2013-03-06 17:34:30

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; 
+0

但javascript并不是由我生成的。这是否意味着打字稿编译器对此错误负责? – lhk 2013-03-06 17:22:21

+0

全局的''''参考是本地Node.js环境,不需要声明。 – Bergi 2013-03-06 17:25:52

0

我想和我有同样的问题 - 我认为缺少exports变量应该被用来加载当你做

import XXXX = module("XXXX"); 

产生这个JavaScript模块的JavaScript代码来生成:

var XXXX = require("./XXXX") 

,我认为马特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变量不再需要