我无法在Typescript中声明循环依赖项。这里是代码:
// Widget.module.ts
/// <reference path="Buttons.ts" />
export module Widget {
class Widget {
}
}
// Buttons.ts
/// <reference path="Widget.module.ts" />
class Button extends Widget{
function x(){
...
}
...
}
在此,我希望有一个主文件定义一个模块,然后从该主文件中引用一些文件。这些文件可能包含许多可以相互调用,实例化或继承的类。
目前我在源Buttons.ts中包含“extends Widget”的行上收到此错误 - 我是否包含在导出的模块中。
Could not file symbol widget
- 更新 -
我想使用引用标记而不是import / require的原因是我想使用typescript编译器中的--out标志将这些单独的Typescript文件编译成单个javascript文件。
答案 0 :(得分:1)
我假设你的两个文件在同一个文件夹中?
从目前的代码中,我无法理解为什么您要在Button.ts
文件中引用Widget.module.ts
,但这不是重点。
您没有包含Widget.module
文件,您只是引用它。引用TypeScript文件只能用于类型声明,而不能用于实现。
将您的代码更改为:
import Widget = require("Widget.module");
class Button extends Widget.Widget {
x() {
// ...
}
// ...
}
请注意,在导出模块而不是类时,需要将类引用为Widget.Widget
。此外,如果您正在构建Web应用程序,则需要使用模块加载程序加载窗口小部件模块。在这种情况下,请查看RequireJS。
更新: 参考标记的好处是您可以引用类型而无需导入它们。这可能很有用
在后一种情况下,假设您有其他代码要求变量属于Button
类型,但实际上并不需要该类本身。
class MyClassThatReferencesButtonButDoesNotActuallyNeedsTheImplementation {
myMethodThatExpectsAButton(someVar:Button) {
someVar.text = "My button!";
}
}
该类不需要Button
的实现,只需要知道它上面有哪些属性和方法。当您了解如果Button
是导入而不是引用时,优势就会变得更加清晰,它需要由JavaScript模块加载器加载。
在第一种情况下,我们假设您的Button
课程需要jQuery
。你打算将jQuery
和你的班级一起包括在内吗?或者你会认为这是全球可用的?从本质上讲,这与上面的情况相同:您不需要jQuery
的TypeScript实现,您只需要知道可用的属性和方法,因此您只需参考jQuery
的定义文件。
--out
标志仅对包含引用文件有用。如果您有imported
个模块,则需要编译所有文件,然后使用RequireJS优化器将输出构建为单个文件。