我想在访问TS类时自动调用一个方法,类似于java的static{ }
。
例如,如果我用 Java 实现一个常量类:
public class Constants
{
public static final String FOO;
static
{
// ... creates a http request ...
FOO = // ... gets "http:/.../api/foo" from server
}
}
如何在 TypeScript 中实现类似的功能?
目前,我正在使用:
export class Constants
{
public static FOO;
public static ensureInitialized(callback)
{
if (this.FOO == null)
{
let request = new XMLHttpRequest();
request.onreadystatechange = function()
{
if (request.readyState == 4)
{
FOO = request.responseText;
callback();
}
};
request.open('POST', "http:/.../api/foo", true);
request.send('');
}
else callback();
}
}
但这需要对使用此常量的所有方法主动调用ensureInitialized()
。 Java 中是否有相当于 static{ }
的 TS?
最佳答案
你真的应该尝试学习 TypeScript 语言并编写惯用的代码。许多程序员在使用 TypeScript 时都抱有这样的错误印象:TypeScript 添加静态类型会将 JavaScript 变成 Java,但事实并非如此。为了有效地使用 TypeScript,您必须了解 JavaScript。
人们可以通过学习 TypeScript 来很好地学习 JavaScript,但前提是要了解 TypeScript 不会添加以下任何内容:
- 经典的面向对象编程模式
- 标称输入
- 运行时类型信息
在惯用的 TypeScript/JavaScript 中,这种方法没有任何意义,因为可以简洁而优雅地实现相同的行为,而类上的静态初始值设定项的想法则几乎不连贯。
这是修改后的版本
let foo: string | undefined;
export const Constants = {
get FOO() {
if (!foo) {
fetch("http:/.../api/foo", { method: "POST" })
.then(response => foo = response.text())
.catch(console.error);
}
return foo;
}
}
优点包括简洁、封装以及让人们通过识别习语来理解您在做什么。
注意:存在异步延迟初始化问题,该答案不会尝试解决该问题,因为它超出了范围。
关于javascript - TypeScript 相当于 Java 中的 static{ },我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57058461/