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

时间:2013-03-06 16:54:23

标签: javascript node.js compiler-construction typescript

这个打字稿:

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上。项目中有许多其他模块,但没有一个模块导致此错误。显然,类定义不会被前面缺少的分号“伤害”。只需将枚举的定义移到一个类定义后面,错误就会消失。将枚举移到接口后面是不够的,因为接口没有直接的等价物,只是被编译器删除了

3 个答案:

答案 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变量。