javascript - TypeScript 相当于 Java 中的 static{ }

标签 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?

最佳答案

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

相关文章:

Javascript - 对象构造和利用 - 深入理解

javascript:构造一个比较输入数组并返回一个新数组的函数,该数组包含在所有输入中找到的元素

javascript - 极限阵列, Angular

javascript - 从外部调用 webpacked 代码(HTML 脚本标签)

javascript - typescript 中可选 Prop 类型检查错误

javascript - 停止从方法调用的 ajax 请求 (ES6)

javascript - 您可以在不使用它的情况下改变工厂函数的属性吗?

javascript - 为什么在类方法中使用我的实例属性未定义?

javascript - 图像不会在 Internet Explorer 中显示为链接

visual-studio-2013 - 如何在 Visual Studio 中将 TypeScript 输出合并到多个文件中