【问题标题】:Why am I getting a 'TypeError: undefined is not a function' here?为什么我在这里收到“TypeError: undefined is not a function”?
【发布时间】:2015-08-10 18:21:26
【问题描述】:

我在尝试运行下面指定的代码时遇到了一个奇怪的(对我而言)错误。代码编译得很好,但是当我运行它时,节点返回这个错误:

<location>/C.js:11
    _super.call(this, "C");
           ^
TypeError: undefined is not a function
    at new C (<location>/C.js:11:16)
    at Function.B.factory (<location>/B.js:15:17)
    at Function.Test.test (<location>/Test.js:6:18)
    at Object.<anonymous> (<location>/app.js:2:6)
    at Module._compile (module.js:460:26)
    at Object.Module._extensions..js (module.js:478:10)
    at Module.load (module.js:355:32)
    at Function.Module._load (module.js:310:12)
    at Function.Module.runMain (module.js:501:10)
    at startup (node.js:129:16)

编译命令:tsc --module commonjs -t ES5 app.ts

使用运行:node app.js

显然我对 Typescript 和 Javascript 都是新手,但我就是不明白为什么会失败。我四处寻找解决方案,但尽管这似乎是一个常见问题,但我对我的特定问题一无所知。任何人都可以解释为什么会这样吗?以下是文件:

A.ts

class A {
    constructor(private name: string) {}
}
export = A;

B.ts

import A = require('./A');
import C = require('./C');

class B extends A {
    constructor(value: string) {
        super(value);
    }
    public static factory() {
        var a: A = new C();
        return a;
    }
}
export = B;

C.ts

import B = require('./B');

class C extends B {
    constructor() {
        super("C");
    }
}
export = C;

Test.ts

import B = require('./B');

class Test {
    public static test() {
        return B.factory();
    }
}
export = Test;

app.ts

///<reference path='./typings/node/node.d.ts' />
import Test = require('./Test');
Test.test();

为了节省一些空间,我粘贴了生成的 javascript 代码。有兴趣的可以在这里找到:javascript dump

【问题讨论】:

    标签: node.js typescript commonjs typescript1.5


    【解决方案1】:

    这是因为你有一个循环依赖。 C 取决于 BB 取决于 C。因此 B 根据规范未定义。 https://nodejs.org/api/modules.html#modules_cycles

    【讨论】:

    • 那么我在使用Node的时候就不能使用这种工厂模式了吗?这是相当令人失望的。非常感谢您的明确答复!
    • 解决方案是将相互依赖的文件移动到一个单个文件中。即使在浏览器中,这也是通用的解决方案。
    • 我试图避免这种情况,因为我怀疑随着项目的发展,这将是一个需要维护的大型 PITA。
    • 不是所有文件。只有这两个有循环
    • 好的,谢谢!一旦我获得足够的分数,我会为你的答案投票。
    猜你喜欢
    • 2014-10-06
    • 2015-10-11
    • 2020-09-13
    • 2022-06-22
    • 2015-06-24
    • 2021-11-20
    • 2012-06-05
    • 2021-06-21
    • 1970-01-01
    相关资源
    最近更新 更多