javascript - 是否可以在 TypeScript 中使构造函数静态化?

标签 javascript typescript constructor static initialization

我阅读了 TypeScript 中的静态构造函数,并亲自尝试了它,但它不起作用。我想通过它初始化一个静态变量(该方法只能调用一次)但是我得到以下编译器错误:

Error: 'static' modifier cannot appear on a constructor declaration.

代码:

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)。请注意,无法将函数设为私有(private),因为它是从外部调用的。

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。

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

关于javascript - 是否可以在 TypeScript 中使构造函数静态化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49589518/

相关文章:

Haskell "not a visible field of constructor"错误

javascript - Div 在点击时显示,但只有一秒钟

javascript - 在 javascript 中拆分问号、感叹号或句号处的字符串并保留这些标记?

node.js - 如何在不强制使用日志库的情况下从 NPM 包进行日志记录

c++ - 如何在部分类模板特化中实现继承?

c# - 为什么在非 MonoBehaviour 序列化类中调用多个构造函数?

javascript - for 循环中添加数字不断增加的新输入时出现的问题

javascript - 如何创建多个图像预览

reactjs - 如何在 Next.js 中使用 localStorage 而不会出现水合作用错误?

reactjs - Next.js getServerSideProps 始终未定义