当前位置 : 主页 > 手机开发 > 其它 >

打字稿中的循环依赖

来源:互联网 收集:自由互联 发布时间:2021-06-22
我在Typescript中声明循环依赖项时遇到问题.在这里,代码: //Widget.module.ts /// reference path="Buttons.ts" /export module Widget { class Widget { }} //Buttons.ts /// reference path="Widget.module.ts" /class Button extend
我在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

–Update–

我想使用引用标记而不是import / require的原因是我想使用typescript编译器中的–out标志将这些单独的Typescript文件编译成单个javascript文件.

我假设你的两个文件在同一个文件夹中?

从当前的代码中,我无法理解为什么你想在Widget.module.ts文件中引用Button.ts,但这不是重点.

您没有包含Widget.module文件,您只是引用它.引用TypeScript文件只能用于类型声明,而不能用于实现.

将您的代码更改为:

import Widget = require("Widget.module");

class Button extends Widget.Widget {
   x() {
     // ...
   }

   // ...
}

请注意,在导出模块时,需要将类引用为Widget.Widget,而不是类.此外,如果您正在构建Web应用程序,则需要在小部件模块中加载模块加载器.在那种情况下,看看RequireJS.

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

>如果您想在TypeScript代码中使用现有的JavaScript库
>或为您自己的代码.

在后一种情况下,假设您有其他代码要求变量属于Button类型,但实际上并不需要类本身.

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

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

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

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

网友评论