繁体   English   中英

静态构造函数打字稿

[英]Static constructor typescript

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

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

代码:

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

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

}

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

何时使用静态构造函数

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

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

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

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

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

class Example {
    public static info: number;

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

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

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

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

使用什么

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

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

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

您可以使用 .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 = ()=>{}

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

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

 export { dataManagement };

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

你可以让你的构造函数方法本质上是空白的

constructor() {}

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM