静态构造函数打字稿

The*_*mer 9 javascript static constructor initialization typescript

我在打字稿中读到一个静态构造函数,并自己尝试了一下,但是它不起作用。我想以此初始化一个静态变量-该方法只能被调用一次。

错误:“静态”修饰符无法出现在构造函数声明中。

码:

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

static constructor() {
    DataManagement.subjects = [];
    //some more code here
}
Run Code Online (Sandbox Code Playgroud)

}

Tho*_*orf 23

虽然 C# 等其他语言确实有静态构造函数,但 TypeScript(和 JavaScript)没有此功能。也就是说,您仍然可以静态地定义一个您自己调用的函数。首先,在我介绍您拥有的选项之前,让我解释一下在哪些情况下您可能需要静态构造函数。

何时使用静态构造函数

在需要计算静态属性值的情况下,静态构造函数很有用。如果您只想设置一个属性(为已知值),则不需要静态构造函数。可以这样做:

class Example {
    public static info = 123;
    // ...
}
Run Code Online (Sandbox Code Playgroud)

如果您需要计算该值,您可以通过三种方式“模拟”静态构造函数。我查看下面的选项并在每个示例中设置静态属性“信息”。

选项 1:在类声明后调用初始化函数

在下面的代码中,该函数_initialize是在类中静态定义的,并在类声明后立即调用。在函数内部,this指的是类,这意味着该关键字可用于设置任何静态值(info如下例所示)。请注意,无法将函数设为私有,因为它是从外部调用的。

class Example {
    public static info: number;

    public static _initialize() {
        // ...
        this.info = 123;
    }
}
Example._initialize();
Run Code Online (Sandbox Code Playgroud)

方案二:直接调用类内部的函数

第二种选择是使用一个函数,该函数在类内部创建后直接调用。该函数看起来只是类的一部分,但与类本身无关(除了在类内部定义),这意味着您不能this在函数内部使用。

class Example {
    static info: number;

    private static _initialize = (() => {
        // "this" cannot be used here
        Example.info = 1234;
    })();
}
Run Code Online (Sandbox Code Playgroud)

替代方法:计算单个属性

基于与选项 2 相同的想法,您可以通过返回值来计算单个属性。如果您只想计算类的一个属性,这可能会很方便。

class Example {
    public static info = (() => {
        // ... calculate the value and return it
        return 123;
    })();
}
Run Code Online (Sandbox Code Playgroud)

使用什么

如果您只想计算单个静态属性,您可能需要使用最后一种(替代)方法。如果您需要进行更复杂的计算或想要设置更多属性,如果您不介意将函数公开,我建议您使用选项 1。否则,请选择选项 2。

请注意,TypeScript 存储库中存在一个问题,其中包含有关选项 1 和选项 2 的更多讨论。


Lla*_*far 20

请注意,从 TypeScript 4.4 开始,支持静态块初始值设定项... https://devblogs.microsoft.com/typescript/announcing-typescript-4-4-rc/#static-blocks

class Foo {
    static Foo.count = 0;

    // This is a static block:
    static {
        if (someCondition()) {
            Foo.count++;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)