打字稿中的前向声明

Max*_*rch 11 forward-declaration typescript

我有两个需要了解彼此成员的课程.

在C++中,我使用前向声明.

打字稿需要做什么?

小智 6

对于接口,您确实需要一个前向声明

declare class F {} 

interface A {
    f:F ;
}

class F implement A {
    f:F ;
    init() { f=this; }
}
Run Code Online (Sandbox Code Playgroud)


lhk*_*lhk 5

我不确定,但是我认为您正在尝试解决一个不存在的问题。这在打字稿中是完全有效的:

class A{
    b=new B();
    func(){
        alert(this.b.member);
    }
}
class B{
    member="hello there";
}
var a=new A();
a.func();
Run Code Online (Sandbox Code Playgroud)

如您所见,可以在定义类B之前使用它,并从类A中访问其成员。这同样适用于函数:

var a=()=>{
    alert("function a");
    b();
}

var b=()=>{
    alert("function b");
}

a();
Run Code Online (Sandbox Code Playgroud)

这样应该可以编译。请注意,只有在实际定义b之后才能调用a。这行不通:

var a=()=>{
    alert("function a");
    b();
}
a();

var b=()=>{
    alert("function b");
}
Run Code Online (Sandbox Code Playgroud)

您在Typescript中不需要前向声明。试想一下,它们是为您的代码自动生成的。

当您需要混合使用Javascript和Typescript时,问题变得更加复杂。由于您所有的Typescript代码都由编译器进行静态类型检查,因此与Javascript框架进行接口并不是那么简单。

必须先声明添加到作用域的所有变量,函数和“类”,然后才能使用它们。假设您的Typescript项目需要jQuery。所有的jQuery魔术都是通过全局变量“ $”完成的,但是即使您已将jQuery脚本添加到html站点中,也不能仅在Typescript代码中引用“ $”。这是使用声明文件的地方。通过添加行

/// <reference path="jquery.d.ts"/>
Run Code Online (Sandbox Code Playgroud)

在Typescript文件的顶部,您将所有可用的jQuery代码通知编译器。最常用的Javascript框架的.d.ts文件可以在这里找到:https : //github.com/borisyankov/DefinitelyTyped

最后两行是.d.ts文件语法的一个很好的示例:

declare var jQuery: JQueryStatic;
declare var $: JQueryStatic;
Run Code Online (Sandbox Code Playgroud)

现在,编译器知道可以使用两个名为“ $”和“ jQuery”的全局变量。而且,如果您使用的是VisualStudio,则这些声明文件将提供出色的智能感知支持。

  • 仅当这些类位于同一文件中时,此方法才有效。 (2认同)
  • 正如旁注:当您使用装饰器并使用另一个类作为第一类装饰器的参数时,就会存在问题。 (2认同)