[英]How to get the name of TypeScript enum type in runtime?
我想以编程方式获取 TypeScript 枚举的名称。
说我有一个这样的枚举:
enum MyEnum {
v1 = 'v1',
v2 = 'v2',
}
我想以编程方式获取此枚举的名称。 我尝试了以下方法:
const enumType = MyEnum
console.log(enumType.constructor.name) // I expect this to return "MyEnum"
但它显示“对象”。
有没有办法以编程方式获取 TypeScript 枚举的名称?
首先,关闭类型系统仅在编译时存在。 当你有
enum MyEnum {
v1 = 'v1',
v2 = 'v2',
}
然后TypeScript知道枚举并确保执行MyEnum['v1']
是正确的,但会引发MyEnum['banana']
的编译时问题。
然而,一旦代码被编译,你就有了纯 JavaScript 。 这是在运行时执行的内容。
枚举被编译为普通的 JavaScript 对象,键和值双重绑定。 这样 TS 确保运行时枚举值的唯一性。 给出的示例枚举变成:
var MyEnum;
(function (MyEnum) {
MyEnum["v1"] = "v1";
MyEnum["v2"] = "v2";
})(MyEnum || (MyEnum = {}));
执行后,您将获得一个MyEnum
变量,该变量包含普通对象{ v1: "v1", v2: "v2" }
我确实说过 TS 会双重绑定键和值。 上面的例子没有很好地展示它,所以这里是另一个:
enum ExampleEnum {
Apple = 1,
Banana = 2,
}
将变成普通对象:
{
1: "Apple",
2: "Banana",
Apple: 1,
Banana: 2
}
因此,两个键(Apple 和 Banana)都是唯一的,值(1 和 2)也是唯一的,因为它们都变成了对象的键,并且不能有重复的键。 它还允许您执行MyEnum[MyEnum[key]]
来获取key
。
我不建议在您的枚举中有重复的值。 技术上可行,但您可能不应该。 如果你做MyEnum[MyEnum[key]]
你会遇到问题
无论如何,TypeScript 不会将枚举名称编码为枚举的一部分,因此一旦您处于运行时,您只需使用一个普通的 JavaScript 变量即可。 并且您无法在 JavaScript 中获取变量的名称。 充其量,您可以执行以下操作:
function printVariableName(input) { console.log("Name:", Object.keys(input)[0]); console.log("Value:", Object.values(input)[0]); } var myVariable = 42; printVariableName({myVariable});
然而,这只是在作弊——你传递了一个包含{ myVariable: 42 }
的对象。 这仅在您已经知道变量是什么时才有效,因此如果您想通过不同的变量间接获取名称,则几乎没有用:
function printVariableName(input) { console.log("Name:", Object.keys(input)[0]); console.log("Value:", Object.values(input)[0]); } var myVariable = 42; var myOtherVariable = myVariable; printVariableName({myOtherVariable});
所以,你正在传递枚举,例如你有一个像这样的函数:
function doSomethingWithEnum(someEnum: MyEnum | MyOtherEnum): void {
//do something with the passed in `someEnum`
}
然后如果你调用doSomethingWithEnum(MyEnum)
那么在函数体内部你doSomethingWithEnum(MyEnum)
引用传入的变量是什么。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.