我有两个班级需要了解彼此的成员。
在 C++ 中,我会使用前向声明。
我必须在打字稿中做什么?
对于接口,您确实需要前向声明
declare class F {}
interface A {
f:F ;
}
class F implement A {
f:F ;
init() { f=this; }
}
我不确定,但我认为您正在尝试解决一个不存在的问题。这在打字稿中完全有效:
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,这些声明文件将提供出色的智能感知支持。
如果我正确理解你,请尝试
declare var a: [class_name]
例子:
module A {
class B {
foo() { }
}
declare var b: B;
class C {
t() {
b.foo()
}
}
}