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

问题描述 投票:0回答:3

此打字稿:

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: 对于那些遇到同样错误的人。您可以手动插入缺少的分号,但这不是一个非常舒适的解决方案,因为您必须在每次编译后执行此操作。我注意到这个问题只发生在枚举上。项目中还有很多其他模块,但没有一个模块导致此错误。显然,类定义不会因其前面缺少分号而“受到损害”。只需将枚举的定义移到类定义之一后面,错误就会消失。将枚举移到接口后面是不够的,因为接口没有直接等效项,只是被编译器删除

javascript node.js typescript
3个回答
7
投票

我认为这与此处描述的问题相同 - 结果是由于

require()
语句后缺少分号:

Typescript 生成的 javascript 不起作用

另一个compiled文件中是否有这样一行?

var UID = require('UID')

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

var UID = require('UID');

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


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
投票

我尝试过,但遇到了同样的问题 - 我认为缺少的

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
变量了。

© www.soinside.com 2019 - 2024. All rights reserved.