web-dev-qa-db-ja.com

静的コンストラクタtypescript

TypeScriptの静的コンストラクターについて読んで自分で試してみましたが、機能しません。それによって静的変数を初期化したい-メソッドは一度だけ呼び出されます。

エラー: 'static'修飾子はコンストラクター宣言では使用できません。

コード:

export class DataManagement {
private static subjects: string[];

static constructor() {
    DataManagement.subjects = [];
    //some more code here
}

}

10
TheProgrammer

C#などの他の言語には静的コンストラクタがありますが、TypeScript(およびJavaScript)にはこの機能がありません。それでも、自分で呼び出す関数を静的に定義できます。最初に、オプションを説明する前に、静的コンストラクターが必要になる場合があることを説明します。

静的コンストラクタを使用する場合

静的コンストラクターは、静的属性の値を計算する必要がある場合に役立ちます。 (既知の値に)属性を設定するだけの場合は、静的コンストラクターは必要ありません。これは次のように行うことができます:

_class Example {
    public static info = 123;
    // ...
}
_

値を計算する必要がある場合、静的コンストラクターを「シミュレート」するには3つの方法があります。以下のオプションを確認し、各サンプルで静的属性「info」を設定します。

オプション1:クラスの宣言後に初期化関数を呼び出す

以下のコードでは、関数__initialize_がクラスで静的に定義され、クラスが宣言された直後に呼び出されます。関数内では、thisはクラスを参照します。つまり、キーワードを使用して任意の静的値を設定できます(以下のサンプルのinfoなど)。関数は外部から呼び出されるため、プライベートにすることはできません。

_class Example {
    public static info: number;

    public static _initialize() {
        // ...
        this.info = 123;
    }
}
Example._initialize();
_

オプション2:クラス内の関数を直接呼び出す

2番目のオプションは、クラス内での作成後に直接呼び出される関数を使用することです。関数のみはクラスの一部のように見えますが、クラス自体とは関係ありません(クラス内で定義されている場合を除く)。つまり、関数内でthisを使用することはできません。

_class Example {
    static info: number;

    private static _initialize = (() => {
        // "this" cannot be used here
        Example.info = 1234;
    })();
}
_

代替:単一の属性を計算する

オプション2と同じ考え方に基づいて、値を返すことで単一の属性を計算できます。これは、クラスの1つの属性のみを計算する場合に便利です。

_class Example {
    public static info = (() => {
        // ... calculate the value and return it
        return 123;
    })();
}
_

何を使うか

単一の静的属性のみを計算する場合は、最後の(alternative)アプローチを使用できます。より複雑な計算を行う必要がある場合、またはより多くの属性を設定する必要がある場合、関数がパブリックであることを気にしない場合は、オプション1を使用することをお勧めします。それ以外の場合は、オプション2を使用します。

TypeScriptリポジトリには issue があり、オプション1と2に関するさらに詳しい説明が含まれていることに注意してください。

3
Thomas Dondorf

Symbol()はこれに使用でき、パブリックアクセスが制限されています。

const STATIC_INIT = Symbol(); // gives you a unique identifier

class MyClass {
  public static[STATIC_INIT] = () => {
    // Your static init code here
  }
}

// Call the init once
MyClass[STATIC_INIT]();
1
Santhos

.tsファイルの静的コードを使用して、静的コンストラクターをシミュレートできます。

パラメータを解析し、デフォルトとマージするという単一の目的を果たすクラスがあるとします。

クラス宣言の後に呼び出しを追加するだけです。

次に例を示します。

export class Env {
    private static _args: {}
    static get args() {
        return this._args;
    }

    static _Initialize() {
        // load settings from Environment
        process.argv.forEach(s => console.log(s))
        this._args =  Object.assign({}, defaults, this.parseCmdLine())
    }
}
Env._Initialize();

TSアプリケーションの例: https://github.com/v-andrew/ts-template

誰が警告する静的コンストラクタとまったく同じように動作します:

  • 複数回呼び出すことができます
  • Envの他のユーザーによって呼び出される可能性があります

これらの問題を無効にするには、_Initializeの最後に_Initializeを再定義します。

        this._Initialize = ()=>{}
1
v-andrew

オブジェクトを探しています:):

 const dataManagement: { subjects: string[] } = {
   subjects: []
 };

 export { dataManagement };
0
Jonas Wilms

そのため、静的コンストラクタの使用は少し誤った名称です。あなたはコンストラクタメソッドを静的にしようとするのではなく、静的インスタンス化メソッドを作成しようとします。好きな名前を付けることができます。私は個人的に初期化を使用しました。

コンストラクタメソッドを本質的に空白にすることができます

constructor() {}

そして、静的な初期化メソッドを持っています

static initialize(): <type-to-use> { //initialization logic };

通常、initializeメソッドで、キーワードnewを使用してコンストラクタを呼び出し、その後、デフォルトでプロパティを設定します。

0
dweill