如果我使用以下 JavaScript 代码:
class test {
static 'a-a';
static 'b-b';
static 'c-c';
}
console.log(Object.keys(test))
// output (chrome console): ['a-a', 'b-b', 'c-c']
我可以在运行时枚举静态字段。
然而,在 TypeScript 中,这不起作用(playground):
class test {
static 'a-a': unknown;
static 'b-b': unknown;
static 'c-c': unknown;
}
console.log(Object.keys(test))
生成这个缺少静态字段的 JavaScript:
"use strict";
class test {
}
console.log(Object.keys(test));
// output (chrome console): []
我需要运行时枚举。为什么被删除了?
我可以做什么来改变这种状况?
我尝试了所有可以想象的编译器选项,但没有发现任何帮助。
如果您希望 TypeScript 发出 类字段,您需要
--target
支持它们的 JavaScript 版本。公共类字段在 ES2022 中引入。
--useDefineForClassFields
编译器选项,因为该选项可确保 TypeScript 类字段和 JavaScript 类字段具有相同的行为。根据文档,对于 ES2022 或更高版本的目标,此选项会自动启用。但为了安全起见,明确启用它并没有什么坏处。
这意味着您需要类似
tsc --target es2022 --useDefineForClassFields ⋯
或等效的 tsconfig.json 设置。