静态构造函数打字稿

时间:2018-03-31 15:42:31

标签: javascript typescript constructor static initialization

我在typescript中读到了一个静态构造函数并自己试了但是它不起作用。我希望用它初始化一个静态变量 - 该方法只能被调用一次。

错误:'static'修饰符不能出现在构造函数声明中。

代码:

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

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

}

5 个答案:

答案 0 :(得分:1)

您可以在.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 :(得分:0)

您正在寻找一个对象:):

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

 export { dataManagement };

答案 2 :(得分:0)

因此,使用静态构造函数有点用词不当。您不是试图使构造方法静态化,而是尝试创建静态实例化方法。可以随便命名。我个人使用过Initialize。

您可以让您的构造方法基本为空

constructor() {}

然后有一个静态的初始化方法

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

通常在initialize方法中,您想使用关键字new调用构造函数,然后,默认设置属性。

答案 3 :(得分:0)

在TypeScript(甚至JavaScript)中,没有什么比其他语言(如C#)中的静态构造函数更好。但是您仍然可以静态定义一个可以自己调用的函数。首先,让我解释一下在哪种情况下,在介绍选项之前可能需要静态构造函数。

何时使用静态构造函数

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

class Example {
    public static info = 123;
    // ...
}

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

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

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

class Example {
    public static info: number;

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

选项2:直接在类内部调用函数

第二个选择是使用一个函数,该函数在类内部创建后直接调用。该函数仅外观类似于类的一部分,但与类本身无关(除非在类内部定义),这意味着您不能在函数内部使用this。 / p>

class Example {
    static info: number;

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

替代:计算单个属性

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

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

使用什么

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

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

答案 4 :(得分:0)

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