qué enum typescript

qué - ¿Cómo convertir string a enum en TypeScript?



qué es numeric enums typescript (7)

A partir de Typescript 2.1, las claves de cadena en las enumeraciones están fuertemente tipadas. keyof typeof se utiliza para obtener información sobre las claves de cadena disponibles ( 1 ):

enum Color{ Red, Green } let typedColor: Color = Color.Green; let typedColorString: keyof typeof Color = "Green"; // Error "Black is not assignable ..." (indexing using Color["Black"] will return undefined runtime) typedColorString = "Black"; // Error "Type ''string'' is not assignable ..." (indexing works runtime) let letColorString = "Red"; typedColorString = letColorString; // Works fine typedColorString = "Red"; // Works fine const constColorString = "Red"; typedColorString = constColorString // Works fine (thanks @SergeyT) let letColorString = "Red"; typedColorString = letColorString as keyof typeof Color; typedColor = Color[typedColorString];

1

¿He definido la siguiente enumeración en TypeScript?

enum Color{ Red, Green }

Ahora en mi función, recibo el color como cadena. He intentado seguir el código.

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

¿Cómo puedo convertir ese valor a enum?


Esta nota se relaciona con la answer de basarat, no con la pregunta original.

Tuve un problema extraño en mi propio proyecto donde el compilador daba un error más o menos equivalente a "no se puede convertir cadena a Color" usando el equivalente de este código:

var colorId = myOtherObject.colorId; // value "Green"; var color: Color = <Color>Color[colorId]; // TSC error here: Cannot convert string to Color.

Descubrí que la inferencia del tipo de compilador se estaba confundiendo y pensaba que colorId era un valor enum y no una ID. Para solucionar el problema, tuve que convertir el ID en una cadena:

var colorId = <string>myOtherObject.colorId; // Force string value here var color: Color = Color[colorId]; // Fixes lookup here.

No estoy seguro de qué causó el problema, pero dejaré esta nota aquí en caso de que alguien se encuentre con el mismo problema que yo.


Lo conseguí trabajando usando el siguiente código.

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


Los enumerados en TypeScript 0.9 están basados ​​en cadena + número. No debería necesitar una aserción de tipo para conversiones simples:

enum Color{ Red, Green } // To String var green: string = Color[Color.Green]; // To Enum / number var color : Color = Color[green];

Pruébalo en línea

Tengo documentación sobre este y otros patrones de Enum en mi libro OSS: https://basarat.gitbooks.io/typescript/content/docs/enums.html


Si el compilador mecanografiado sabe que el tipo de variable es una cadena, esto funciona

let colorName : string = "Green"; let color : Color = Color[colorName];

de lo contrario, debería convertirlo explícitamente en una cadena (para evitar la advertencia del compilador)

let colorName : any = "Green"; let color : Color = Color["" + colorName];

En tiempo de ejecución, ambas soluciones funcionarán.


Si está seguro de que una cadena de entrada coincide exactamente con Color enum, utilice:

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

En el caso en que una cadena de entrada no coincida con Enum use:

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

Playground

Si no lanzamos enum a <any> type, entonces tsc mostrará el error

El elemento tiene implícitamente el tipo ''cualquier'' porque la expresión del índice no es del tipo ''número''.

Significa que, de forma predeterminada, el tipo de TS Enum funciona con índices numéricos, es decir let c = Color[0] , pero no con índices de cadenas como let c = Color["string"] . Esta es una restricción conocida por parte del equipo de Microsoft para los índices de cadenas de objetos más generales.


También encontré el mismo error de compilación. Solo una ligera variación más corta del enfoque de Sly_cardinal.

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