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

Typescript生成的JavaScript有一个不是函数的函数,javascript,node.js,compiler-construction,typescript,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

此字体脚本:

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 ...
我做错了什么

更新: Matt B.已解决此问题。这是typescript编译器中的一个已知错误。tsc无法在require语句后插入分号,这可能会导致奇怪的错误。手动将分号添加到我的代码中解决了此问题。以下是指向codeplex问题的链接:

更新2:
对于那些遇到相同错误的人。您可以手动插入缺少的分号,但这不是一个很好的解决方案,因为您必须在每次编译后执行此操作。我注意到,问题只出现在枚举中。项目中有许多其他模块,但没有一个模块导致此错误。显然是一个类定义不是“有害的”通过前面缺少的分号。只需将枚举的定义移到一个类定义后面,错误就会消失。将枚举移到接口后面是不够的,因为接口没有直接等价物,只是被编译器删除了。在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;

我认为这和这里描述的问题是一样的——结果是由于
require()
语句后缺少分号:

在另一个编译文件中是否有类似的行

var UID=require('UID')

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

var UID=require('UID');


这似乎是一个TypeScript错误;下面是错误报告(请投票!):

我试过了,我也遇到了同样的问题-我假设缺少的
导出变量应该由加载模块时使用的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 = {}));

这样,就不再需要导出变量。

是整个脚本吗?第二个
(在错误消息中)不应该存在:
(函数(UID)){
。代码部分工作正常:与另一个文件的连接不正确?错误消息中的代码与上面发布的代码不同。错误包含double
,而不是发布的示例。并且它不是必需的,因为您在node.js中,因此已定义了
导出
。但未生成javascript这是否意味着typescript编译器要对此错误负责?全局
导出
引用是Node.js环境的本机引用,不需要声明。是的,这解决了问题。感谢您的回答。我在codeplex上对该问题进行了投票,以防其他人也对错误报告进行投票,下面是链接:很好,我给问题添加链接