gpt4 book ai didi

typescript - 如何在运行时获取 TypeScript 枚举类型的名称?

转载 作者:行者123 更新时间:2023-12-03 22:00:22 26 4
gpt4 key购买 nike

我想以编程方式获取 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 对象,双重绑定(bind)键和值。这样 TS 可以确保运行时枚举值的唯一性。给出的示例枚举变成:

var MyEnum;
(function (MyEnum) {
MyEnum["v1"] = "v1";
MyEnum["v2"] = "v2";
})(MyEnum || (MyEnum = {}));

See on TypeScript Playground

执行后,您将获得 MyEnum保存普通对象的变量 { v1: "v1", v2: "v2" }
我确实说过 TS 会双重绑定(bind)键和值。上面的例子没有很好的展示,所以这里再举一个:

enum ExampleEnum {
Apple = 1,
Banana = 2,
}

将变成普通对象:
{ 
1: "Apple",
2: "Banana",
Apple: 1,
Banana: 2
}

See on TypeScript Playground

因此,两个键(Apple 和 Banana)都是唯一的,值(1 和 2)也是唯一的,因为它们都变成了对象的键,并且您不能有重复的键。它还允许你做 MyEnum[MyEnum[key]]获取什么 key是。

我不建议在你的枚举中有重复的值。技术上可行,但您可能不应该这样做。如果你这样做,你会遇到问题 MyEnum[MyEnum[key]]
无论如何,TypeScript 不会将枚举名称编码为枚举的一部分,因此一旦您在运行时,您只需使用一个普通的 JavaScript 变量即可。和 you cannot get the name of a variable in 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)然后在函数体内你不能取消引用传入的变量是什么。

关于typescript - 如何在运行时获取 TypeScript 枚举类型的名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59822723/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com