在TypeScript中解决RequireJs循环依赖

时间:2014-07-30 20:08:09

标签: requirejs typescript amd

我正在使用TypeScript + AMD(RequireJs),我遇到了关于循环依赖的问题。 tsc非常平滑地处理循环依赖,但是当它运行时,花了我几个小时才发现我面临循环依赖问题。

这是我的情景:

Singleton.ts

import Window = require("./Window");

class Singleton
{
    private w : Window;
    private counter : number = 0;

    constructor() {
        w = new Window();
    }

    Increment() : number {
        return ++this.counter;
    }
}
export = Singleton;

Window.ts

import Singleton = require("./Singleton");
declare var global_instance : Singleton;

class Window
{
    private my_number : number = 0;

    constructor() {
        this.my_number = global_instance.Increment();
    }
}
export = Window;

看起来很简单,它会导致循环依赖,因此我无法在浏览器中实现它。但正如我所说tsc完美地处理它没有任何问题。当我搜索互联网时,我发现了一些建议的解决方案:

This one建议在类型之前添加typeof,以防止编译器实际将类型的文件放在require列表中。但它导致了十几个编译器错误,所以它就出来了。

This one听起来很有希望,但它是一个RequireJs解决方案,我不确定如何在TypeScript中实现它!

有没有人有任何解决方案如何处理循环依赖,同时受益于tsc编译器的类型检查?

2 个答案:

答案 0 :(得分:2)

因为这些文件绝对捆绑在一起,所以将它们放在一个文件中。它不仅可以解决您的循环引用,还可以减少一个HTTP请求(保证您需要)。

一旦它们在同一个文件中,您可以决定进一步合并这些概念,或者拆分它们都依赖的部分来删除循环依赖。

答案 1 :(得分:0)

如果您使用的是requirejs.d.ts

用这个

修改它
declare var exports: any;

然后你的类显式调用exports。

import Window = require("./Window");

class Singleton
{
    private w : Window.Window;
    private counter : number = 0;

    constructor() {
        w = new Window.Window();
    }

    Increment() : number {
        return ++this.counter;
    }
}
exports.Singleton = Singleton;
export = Singleton;

Window.ts

import Singleton = require("./Singleton");
declare var global_instance : Singleton.Singleton;

class Window
{
    private my_number : number = 0;

    constructor() {
        this.my_number = global_instance.Increment();
    }
}
exports.Window = Window;
export = Window;

我希望有一种方法,例如在节点中直接设置导出,但这似乎不起作用,至少对我而言。