【问题标题】:Typescript generated JavaScript has a function that is not a functionTypescript 生成的 JavaScript 有一个不是函数的函数
【发布时间】:2013-02-21 14:21:12
【问题描述】:

这个打字稿:

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. 解决了这个问题。这是 typescript 编译器中的一个已知错误。 tsc 无法在 require 语句后插入分号,这可能会导致奇怪的错误。手动将分号添加到我的代码中解决了这个问题。这是codeplex问题的链接: http://typescript.codeplex.com/workitem/364

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

【问题讨论】:

  • 这是整个脚本吗?
  • 第二个)(在您的错误消息中)不应该存在:(function (UID)) {。代码部分工作正常:jsfiddle.net/antisanity/cRNeN
  • 与另一个文件的连接不正确?
  • 错误信息中的代码和上面贴的代码不一样。错误包含双 ),而不是发布的示例。
  • 不需要,因为你在 node.js 中,所以 exports 已经定义了。

标签: javascript node.js compiler-construction typescript


【解决方案1】:

我认为这与此处描述的问题相同 - 原来是由于 require() 语句后缺少分号:

Typescript generating javascript that doesn't work

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

var UID = require('UID')

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

var UID = require('UID');

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

【讨论】:

  • 是的,这解决了问题。谢谢您的回答。我也对 codeplex 上的问题表示赞同
  • 如果其他人也想支持这个错误报告,这里是链接:typescript.codeplex.com/workitem/364
  • 很好,我会添加问题的链接
【解决方案2】:

我试过了,但我遇到了同样的问题 - 我假设缺少的 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 变量就不再需要了。

【讨论】:

    【解决方案3】:

    在您的 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;
    

    【讨论】:

    • 但是 javascript 不是我生成的。这是否意味着打字稿编译器对此错误负责?
    • 全局exports引用是Node.js环境原生的,不需要声明。
    猜你喜欢
    • 2021-09-17
    • 1970-01-01
    • 2012-09-19
    • 1970-01-01
    • 2021-12-28
    • 2018-06-14
    • 2021-07-28
    • 2017-12-23
    • 2018-02-07
    相关资源
    最近更新 更多