我发现this great answer关于如何将字符串转换为打字稿枚举。基于此,我编写了此功能
enum Color { Red='red', Green='green' }
function mapColorString(strColor: string): Color {
const colorKey = strColor as keyof typeof Color
return Color[colorKey]
}
但是现在当我尝试使其通用时,
function getEnumFromString<T>(str: string): T {
const enumKey = str as keyof T
return T[enumKey]
}
我在return语句中收到错误:'T' only refers to a type, but is being used as a value here.
我想使它具有通用性,因为我需要根据它们的字符串值生成许多枚举,并且我不想为每个枚举使用单独的方法。
答案 0 :(得分:3)
T
只是枚举的类型。类型将被删除,并且在运行时不存在。您需要传入代表枚举的对象:
enum Color { Red='red', Green='green' }
function getEnumFromString<T, K extends string>(enumObj: { [P in K]: T },str: string): T {
const enumKey = str as K
return enumObj[enumKey]
}
getEnumFromString(Color, 'Red');
K
将代表枚举的键,T
将是枚举值的类型
答案 1 :(得分:3)
当我通过枚举定义时,我可以使它工作:
enum Color { Red='red', Green='green' }
function getEnumFromString<T>(type: T, str: string): T[keyof T] {
const casted = str as keyof T;
return type[casted];
}
const bar = getEnumFromString(Color, 'Red');