首页 > 解决方案 > TypeScript 相当于 Java 中的 static{ }

问题描述

我想在访问 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()使用此常量的所有方法。是否有任何相当于static{ }Java 的 TS?

标签: javascripttypescriptes6-class

解决方案


你真的应该尝试学习 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;
    }
}

优点包括简洁、封装以及通过识别习语让人们了解您在做什么。

注意:存在异步延迟初始化的问题,此答案未尝试解决,因为它超出了范围。


推荐阅读