Typescript初始化类类型的静态变量

时间:2014-06-20 15:21:46

标签: typescript

我有两个班级FooBar。在课程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时,我做错了什么?

4 个答案:

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