我有两个班级Foo
和Bar
。在课程Bar
中,我有一个名为myFoo
的静态变量,我希望它能自动初始化:
class Foo {
}
class Bar {
static myFoo: Foo = new Foo();
}
但是,我收到此错误:
未捕获的ReferenceError:未定义Foo
如果我在Bar
的构造函数中初始化该静态变量,那么它可以正常工作:
class Bar {
static myFoo: Foo;
constructor() {
Bar.myFoo = new Foo();
}
}
为什么?当我尝试直接初始化静态变量myFoo
时,我做错了什么?
答案 0 :(得分:8)
你绝对不想做第二件事,因为每当你构建一个新的Bar并且你当然不想要那个时,它会覆盖myFoo
。
这里有一个运行时问题,而不是编译时问题。在加载Foo
类之前,必须加载Bar
类 ,否则静态初始化程序将失败。如果两个类按上述顺序位于单个文件中,则可以正常工作。如果类在单独的文件中,并且您告诉TypeScript编译为单个文件,它应该为您找出正确的顺序(尽管该区域中存在错误)。如果您正在编译以分离文件,则需要以正确的顺序在页面上包含脚本以满足依赖性。
答案 1 :(得分:3)
您可以立即按照类声明进行初始化调用:
class MyClass {
static initialize() {
// Initialization
}
}
MyClass.initialize();
答案 2 :(得分:0)
这需要JQuery,但我所做的就是拥有等效的“静态构造函数”。
namespace SomeNamespace {
$(() => SomeClass.StaticConstructor());
export class SomeClass {
public static StaticConstructor() {
}
}
}
例如,这也可用作应用程序的“入口点”。
namespace SomeNamespace {
$(() => SomeClass.Start());
export class SomeClass {
private static sInstance: SomeClass;
public static Start() {
SomeClass.sInstance = new SomeClass();
}
}
}
答案 3 :(得分:0)
正如 Jeffery Grajkowski 所说,您的第二种方法是错误的。你可以在定义中初始化。
class Bar {
static myFoo: Foo = new Foo();
}