16

我有两个班级需要了解彼此的成员。

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

我必须在打字稿中做什么?

4

3 回答 3

6

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

declare class F {} 

interface A {
    f:F ;
}

class F implement A {
    f:F ;
    init() { f=this; }
}
于 2013-10-31T01:08:30.940 回答
5

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

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

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

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

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

a();

这应该编译得很好。请注意,只有在实际定义了 b 之后才能调用 a。这不起作用:

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

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

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

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

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

/// <reference path="jquery.d.ts"/>

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

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

declare var jQuery: JQueryStatic;
declare var $: JQueryStatic;

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

于 2013-01-17T21:22:30.900 回答
1

如果我正确理解你,请尝试

declare var a: [class_name]

例子:

    module A {
        class B {
            foo() { }
        }
        declare var b: B;
        class C {
            t() {
                b.foo()
            }
        }
    }
于 2013-01-17T20:42:27.853 回答