我阅读了 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/