我想在访问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?
答案 0 :(得分:1)
您确实应该尝试学习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;
}
}
优势包括简洁,封装,以及让人们通过识别成语来了解您在做什么。
注意:存在一个异步延迟初始化的问题,由于它不在范围内,因此该答案未尝试解决。
答案 1 :(得分:1)
通常,我们希望甚至在使用该值之前就先执行静态
export class Constants {
static foo: any;
static __static_initialized: boolean = false;
static __static_initialize() {
if (Constants.__static_initialized) { return; }
Constants.__static_initialized = true;
fetch("http:/.../api/foo", { method: "POST" })
.then(response => Constants.foo = response.text())
.catch(console.error);
}
}
Constants.__static_initialize();