Typescript初始化类类型的静态变量
我有两门课Typescript初始化类类型的静态变量,typescript,Typescript,我有两门课Foo和Bar。在类Bar中,我有一个名为myFoo的静态变量,我希望它自动初始化: class Foo { } class Bar { static myFoo: Foo = new Foo(); } 但是,我遇到了以下错误: 未捕获引用错误:未定义Foo 如果我在Bar的构造函数中初始化该静态变量,那么它工作正常: class Bar { static myFoo: Foo; constructor() { Bar.myFoo = n
Foo
和Bar
。在类Bar
中,我有一个名为myFoo
的静态变量,我希望它自动初始化:
class Foo {
}
class Bar {
static myFoo: Foo = new Foo();
}
但是,我遇到了以下错误:
未捕获引用错误:未定义Foo
如果我在Bar
的构造函数中初始化该静态变量,那么它工作正常:
class Bar {
static myFoo: Foo;
constructor() {
Bar.myFoo = new Foo();
}
}
为什么呢?当我试图直接初始化静态变量
myFoo
时,我做错了什么?你肯定不想做第二件事,因为每次你构造一个新的条时,它都会覆盖myFoo
,你肯定不想这样做
这里的问题是运行时问题,而不是编译时问题。必须在加载
Bar
类之前加载Foo
类,否则静态初始值设定项将失败。如果两个类都按上述顺序位于一个文件中,则可以正常工作。如果类位于单独的文件中,并且您告诉TypeScript编译为单个文件,它应该为您确定正确的顺序(尽管该区域中存在bug)。如果要编译为单独的文件,则需要在页面上以正确的顺序包含脚本,以满足依赖关系。您可以在类声明之后立即调用初始化:
class MyClass {
static initialize() {
// Initialization
}
}
MyClass.initialize();
这需要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();
}
}
}
正如Jeffery Grajkowski所说,你的第二种方法是错误的。您可以在定义中初始化
class Bar {
static myFoo: Foo = new Foo();
}
事实上,这是因为我以错误的顺序导入了脚本文件。谢谢