簡體   English   中英

打字稿初始化類類型的靜態變量

[英]Typescript initialize static variable of a class type

我有兩個類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時,我做錯了什么?

您絕對不想做第二件事,因為每次構建新 Bar 時都會覆蓋myFoo而您當然不希望那樣做。

您在這里遇到的是運行時問題,而不是編譯時問題。 必須在加載Bar類之前加載Foo否則靜態初始化程序將失敗。 如果兩個類都按上述順序在一個文件中,它就可以工作。 如果這些類位於單獨的文件中並且您告訴 TypeScript 編譯為單個文件,它應該為您找出正確的順序(盡管該區域存在錯誤)。 如果您要編譯為單獨的文件,則需要以正確的順序在頁面上包含腳本以滿足依賴性。

您可以在類聲明之后立即調用 initialize :

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM