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

Why is my function causing a TypeError <function> is not a function?

我调用的函数显然是一个函数,但我一直收到 TypeError: [function name] is not a function。

这是重现错误的最小示例。

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

中进行测试

我花了很长时间才弄明白,但最终归结为循环引用。

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

的依赖项

要解决此问题,baseUrl 只需移动到另一个文件 baseUrl.ts

这次经历的一些惨痛教训:

  1. 没有什么应该依赖于 main.ts...那应该是显而易见的。
  2. 循环引用产生的错误消息可能非常模糊,完全不相关,并且与实际问题相差好几层,所以不要依赖错误消息来避免循环依赖。