我正在使用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
编译器的类型检查?
答案 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;
我希望有一种方法,例如在节点中直接设置导出,但这似乎不起作用,至少对我而言。