此打字稿:
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){
^ 类型错误:对象不是函数
at ...
我做错了什么?
更新: Matt B. 已经解决了这个问题。这是打字稿编译器中的一个已知错误。 tsc 无法在 require 语句后插入分号,这可能会导致奇怪的错误。手动将分号添加到我的代码中解决了问题。这是 codeplex 问题的链接: http://typescript.codeplex.com/workitem/364
更新2: 对于那些遇到同样错误的人。您可以手动插入缺少的分号,但这不是一个非常舒适的解决方案,因为您必须在每次编译后执行此操作。我注意到这个问题只发生在枚举上。项目中还有很多其他模块,但没有一个模块导致此错误。显然,类定义不会因其前面缺少分号而“受到损害”。只需将枚举的定义移到类定义之一后面,错误就会消失。将枚举移到接口后面是不够的,因为接口没有直接等效项,只是被编译器删除
我认为这与此处描述的问题相同 - 结果是由于
require()
语句后缺少分号:
Typescript 生成的 javascript 不起作用
另一个compiled文件中是否有这样一行?
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;
我尝试过,但遇到了同样的问题 - 我认为缺少的
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
变量了。