打字稿中的循环依赖

时间:2014-01-13 08:47:49

标签: typescript

我无法在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文件。

1 个答案:

答案 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


更新: 参考标记的好处是您可以引用类型而无需导入它们。这可能很有用

  1. 如果您想在TypeScript代码中使用现有的JavaScript库
  2. 或您自己的代码。
  3. 在后一种情况下,假设您有其他代码要求变量属于Button类型,但实际上并不需要该类本身。

    class MyClassThatReferencesButtonButDoesNotActuallyNeedsTheImplementation {
        myMethodThatExpectsAButton(someVar:Button) {
            someVar.text = "My button!";
        }
    }
    

    该类不需要Button的实现,只需要知道它上面有哪些属性和方法。当您了解如果Button是导入而不是引用时,优势就会变得更加清晰,它需要由JavaScript模块加载器加载。

    在第一种情况下,我们假设您的Button课程需要jQuery。你打算将jQuery和你的班级一起包括在内吗?或者你会认为这是全球可用的?从本质上讲,这与上面的情况相同:您不需要jQuery的TypeScript实现,您只需要知道可用的属性和方法,因此您只需参考jQuery的定义文件。

    --out标志仅对包含引用文件有用。如果您有imported个模块,则需要编译所有文件,然后使用RequireJS优化器将输出构建为单个文件。