我在typescript中读到了一个静态构造函数并自己试了但是它不起作用。我希望用它初始化一个静态变量 - 该方法只能被调用一次。
错误:'static'修饰符不能出现在构造函数声明中。
代码:
export class DataManagement {
private static subjects: string[];
static constructor() {
DataManagement.subjects = [];
//some more code here
}
}
答案 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”。
在下面的代码中,函数_initialize
是在类中静态定义的,并在声明类后立即调用。在函数内部,this
引用了该类,这意味着该关键字可用于设置任何静态值(例如下面示例中的info
)。请注意,无法将函数设为私有,因为它是从外部调用的。
class Example {
public static info: number;
public static _initialize() {
// ...
this.info = 123;
}
}
Example._initialize();
第二个选择是使用一个函数,该函数在类内部创建后直接调用。该函数仅外观类似于类的一部分,但与类本身无关(除非在类内部定义),这意味着您不能在函数内部使用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]();