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();
}

事实上,这是因为我以错误的顺序导入了脚本文件。谢谢