【发布时间】:2021-02-27 02:24:51
【问题描述】:
我想编写一个函数来获取传递给它的枚举成员的名称。比如:
enum Cars {
dodge,
ford,
toyota
}
enum Trucks {
ford,
nissan,
gmc
}
class Foo() {
truckType : Trucks;
}
const getEnumMemberName = function(enumMember : any) : string {
//implementation?
}
const main = function() {
let f = new Foo();
foo.truckType = Trucks.ford;
console.log(`Trucktype is ${getEnumMemberName(foo.truckType}`);
}
main();
//Should log "Trucktype is ford" to the console
我认为如果您不将枚举类型本身提供给函数,这可能是不可能的,因为虽然 foo.truckType 被键入为卡车,但看起来所有字段在运行时都是一个没有类型信息的数字可用。
我知道 a) 我可以将枚举定义为字符串值而不是默认数字,而且我还知道如果我知道使用 let name = Trucks[foo.trucktype] 的枚举名称,我可以获取成员的名称。我的问题是您是否可以从类型为枚举的变量(例如truckType : Trucks)推断枚举类型,还是只是转换为数字并且类型信息不可用?
【问题讨论】:
-
TS编译成JS时类型系统为erased;
enumvalues 只是运行时的字符串或数字;没有返回枚举对象的“链接”。另一方面,数字枚举 object 具有 reverse mappings,您可以使用它从值中获取名称。但是你不能在不传入枚举对象的情况下对任意枚举执行此操作,例如getEnumMemberName(Trucks, foo.truckType)。如果这对你有用,我可以把它写下来作为答案。 -
是的,这就是我的怀疑。我希望有一个 getType 函数,我可以用它来确定参数的类型。
-
那么,您是否想要一个答案(例如,“不,抱歉”)以及像 this 这样的代码作为可能的解决方法?
-
可能会有所帮助,是的,谢谢。主要是我不明白 Trucks 参数的类型是什么。
-
您提供的将枚举类型作为记录传递的代码非常有用,谢谢。如果你想发布它,我会接受它。
标签: typescript