TypeScript与Java中的static {}等效

时间:2019-07-16 13:31:51

标签: javascript typescript es6-class

我想在访问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?

2 个答案:

答案 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();