javascript - 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?
解决方案
你真的应该尝试学习 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;
}
}
优点包括简洁、封装以及通过识别习语让人们了解您在做什么。
注意:存在异步延迟初始化的问题,此答案未尝试解决,因为它超出了范围。
推荐阅读
- node.js - 将字节转换为 pdf
- python - 在多特征 TensorFlow 数据集中引用和标记单个特征列
- javascript - 悬停容器时临时更改超链接颜色和悬停颜色
- sql - 编写查询以选择从其部门获得最高薪水的 ENAME(员工姓名)
- swift - 如何创建一个可以被任何视图控制器快速访问和更改的全局日期?
- android - 临时保存数据
- javascript - Angular 可观察服务返回 foreach 数组。需要执行for循环http请求
- bluetooth-lowenergy - BLE Eddystone 数据包 - RSSI、Tx 和距离
- javascript - 打字稿泛型 - 将接口键用于另一种键类型
- sharepoint-2013 - 如何使用 CSOM 将列表共享点列表附件复制到文档库