为什么导致TypeError <function>的函数不是函数?

时间:2016-08-10 21:12:45

标签: javascript typescript requirejs circular-dependency circular-reference

我正在调用一个看起来显然是函数的函数,但我一直得到TypeError:[函数名]不是函数。

以下是重现错误的最小示例。

main.ts

import someFunction from './someFunction'
export const baseUrl = document.location.protocol + '//' + document.location.hostname

someFunction(); //causing TypeError: someFunction is not a function

someFunction.ts

import {Foo} from './Foo'
export default function someFunction(): void {
    //some code here
    let foo = new Foo();
    //some other code here
}

Foo.ts

import {baseUrl} from './main'
export class Foo{
    constructor()

    private someRandomPrivateFunction(): void {
        //some code
        let url = baseUrl + "other/stuff"; //removing this line fixes the TypeError
        //some other code
    }
}

有关正在使用的背景项目的一些细节。

Typescript是针对ES5的1.8,并使用AMD生成模块。

RequireJS是2.2.0,data-main指向main

我在Chrome 52.0.2743.116 m测试

1 个答案:

答案 0 :(得分:1)

这花了我太长时间才弄明白,但最终还是归结为循环参考。

Foo.ts中,如果删除了对baseUrl的引用,那么其他一切正常,因为baseUrl是来自main.ts

的依赖项

要解决此问题,只需将baseUrl移至其他文件baseUrl.ts

从这次经历中吸取了一些痛苦的教训:

  1. 什么都不应该依赖于main.ts ......应该是显而易见的。
  2. 从循环引用中产生的错误消息可能非常模糊,完全不相关,并且几层远离实际问题,因此不要依赖于错误消息以避免循环依赖。