我在TypeScript中定义了以下enum:

enum Color{
    Red, Green
}

现在在我的函数中,我以字符串的形式接收颜色。我尝试了以下代码:

var green= "Green";
var color : Color = <Color>green; // Error: can't convert string to enum

如何将该值转换为enum?


当前回答

我得到了它的工作使用以下代码。

var green= "Green";
var color : Color= <Color>Color[green];

其他回答

我还遇到了同样的编译器错误。只是Sly_cardinal方法的一个稍短的变种。

var color: Color = Color[<string>colorId];

打印稿1.倍

如果你确定输入字符串与Color enum完全匹配,那么使用:

const color: Color = (<any>Color)["Red"];

在输入字符串可能不匹配Enum的情况下,使用:

const mayBeColor: Color | undefined = (<any>Color)["WrongInput"];
if (mayBeColor !== undefined){
     // TypeScript will understand that mayBeColor is of type Color here
}

操场上


如果我们没有将enum转换为<任意>类型,那么TypeScript将显示错误:

元素隐式具有“any”类型,因为索引表达式不是类型“number”。

这意味着默认情况下,TypeScript Enum类型与数字索引一起工作。 let c = Color[0],但是没有像let c = Color["string"]这样的字符串索引。这是微软团队针对更一般问题对象字符串索引的一个已知限制。

2.打印稿x-4x

TypeScript移动到typeof概念的键。

如果some使用字符串值enum:

enum Color {
  Green = "GRN",
  Red = "RD"
}

然后有语言解决方案映射键值(颜色。Green -> "GRN")只是通过访问枚举成员,但没有简单的方法来做相反的事情("GRN" -> Color.Green)。通过使用反向映射:

请记住,字符串enum成员不会得到反向映射 根本就不存在。

一种可能的解决方案是手动检查值并将值强制转换为enum。请注意,它只适用于字符串枚举。

function enumFromStringValue<T> (enm: { [s: string]: T}, value: string): T | undefined {
  return (Object.values(enm) as unknown as string[]).includes(value)
    ? value as unknown as T
    : undefined;
}

enumFromStringValue(Color, "RD"); // Color.Red
enumFromStringValue(Color, "UNKNOWN"); // undefined
enumFromStringValue(Color, "Red"); // undefined

如果你正在处理TypeScript 4.1+和字符串enum,并且你想要一个简单的具有编译时和运行时安全的字符串到enum转换器,下面的工作很好:

export const asEnum = <
  T extends { [key: string]: string },
  K extends keyof T & string
>(
  enumObject: T,
  value: `${T[K]}`
): T[K] => {
  if (Object.values(enumObject).includes(value)) {
    return (value as unknown) as T[K];
  } else {
    throw new Error('Value provided was not found in Enum');
  }
};

enum Test {
  hey = 'HEY',
}

const test1 = asEnum(Test, 'HEY');   // no complaints here
const test2 = asEnum(Test, 'HE');    // compile-time error
const test3 = asEnum(Test, 'HE' as any); // run-time error

我得到了它的工作使用以下代码。

var green= "Green";
var color : Color= <Color>Color[green];
enum Color{
    Red, Green
}

// To String
 var green: string = Color[Color.Green];

// To Enum / number
var color : Color = Color[green as keyof typeof Color]; //Works with --noImplicitAny

这个例子使用TypeScript中的——noImplicitAny

来源: https://github.com/Microsoft/TypeScript/issues/13775 issuecomment - 276381229 https://www.typescriptlang.org/docs/handbook/advanced-types.html索引类型中