将字符串转换为打字稿枚举的通用函数

时间:2018-10-25 14:56:17

标签: typescript

我发现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.

我想使它具有通用性,因为我需要根据它们的字符串值生成许多枚举,并且我不想为每个枚举使用单独的方法。

2 个答案:

答案 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');