He definido la siguiente enumeración en TypeScript:
enum Color{
Red, Green
}
Ahora en mi función recibo el color como una cadena. He intentado el siguiente código:
var green= "Green";
var color : Color = <Color>green; // Error: can't convert string to enum
¿Cómo puedo convertir ese valor en una enumeración?
typescript
Amitabh
fuente
fuente
--noImplicitAny
(en VS desmarcado "Permitir tipos 'cualquiera' implícitos"). Produceerror TS7017: Index signature of object type implicitly has an 'any' type.
Para mí esto funcionó:var color: Color = (<any>Color)[green];
(probado con la versión 1.4)var color : Color = Color[green as keyof typeof Color];
A partir de Typecript 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 ):https://www.typescriptlang.org/docs/handbook/advanced-types.html#index-types
fuente
let s = "Green"; let typedColor = <keyof typeof Color> s;
let
conconst
funcionará sin lanzar. Ejemplo actualizado para aclarar esto. Gracias @SergeyTtypedColorString = Color["Black"];
ahora regresaerror TS7015: Element implicitly has an 'any' type because index expression is not of type 'number'
const color: Color = Color[colorString as keyof typeof Color];
Si está seguro de que una cadena de entrada tiene una coincidencia exacta con Color enum, use:
En el caso de que una cadena de entrada no coincida con Enum, use:
Patio de recreo
Si no enviamos
enum
a<any>
escribir, TypeScript mostrará el error:Significa que, de manera predeterminada, el tipo de enumeración TypeScript funciona con índices numéricos, es decir
let c = Color[0]
, pero no con índices de cadena comolet c = Color["string"]
. Esta es una restricción conocida por el equipo de Microsoft para los índices de cadenas de objetos de problemas más generales .fuente
typeof '0'
debería serstring
Este ejemplo funciona con
--noImplicitAny
TypeScriptFuentes:
https://github.com/Microsoft/TypeScript/issues/13775#issuecomment-276381229 https://www.typescriptlang.org/docs/handbook/advanced-types.html#index-types
fuente
Esta nota se relaciona con la respuesta de basarat , no con la pregunta original.
Tuve un problema extraño en mi propio proyecto en el que el compilador estaba dando un error aproximadamente equivalente a "no se puede convertir la cadena a Color" usando el equivalente de este código:
Descubrí que la inferencia de tipo de compilador se estaba confundiendo y pensé que
colorId
era un valor de enumeración y no una identificación. Para solucionar el problema, tuve que lanzar la ID como una cadena:No estoy seguro de qué causó el problema, pero dejaré esta nota aquí en caso de que alguien tenga el mismo problema que yo.
fuente
Lo tengo funcionando usando el siguiente código.
fuente
Si proporciona valores de cadena a su enumeración, un reparto directo funciona bien.
fuente
const colorEnum = "Blue" as Color
no se equivocará, y se quedaría pensando quecolorEnum
está bien. Pero si loconsole.log
hicieras, verías "Azul". La respuesta de Artru es buena, porquecolorEnum
lo seráundefined
, y luego puedes verificar eso específicamente.Dado que usa el mecanografiado: muchas de las soluciones anteriores pueden no funcionar o son demasiado complejas.
Situación : las cadenas no son las mismas que los valores de enumeración (la carcasa es diferente)
Solo usa:
fuente
También me encontré con el mismo error del compilador. Solo una variación ligeramente más corta del enfoque de Sly_cardinal.
fuente
myProp.color = Color[<string><any>myProp.color]
CheersSi el compilador de TypeScript sabe que el tipo de variable es una cadena, esto funciona:
De lo contrario, debe convertirlo explícitamente en una cadena (para evitar advertencias del compilador):
En tiempo de ejecución ambas soluciones funcionarán.
fuente
<string>colorName
lugar de"" + colorName
?Hay mucha información mixta en esta pregunta, así que cubramos toda la implementación de TypeScript 2.x + en la Guía de Nick para usar enumeraciones en modelos con TypeScript .
Esta guía es para: personas que crean código del lado del cliente que ingiere un conjunto de cadenas conocidas del servidor que se modelaría convenientemente como una enumeración en el lado del cliente.
Define la enumeración
Comencemos con la enumeración. Debería verse más o menos así:
Dos cosas a destacar aquí:
Los declaramos explícitamente como casos de enumeración respaldados por cadenas que nos permiten instanciarlos con cadenas, no con otros números no relacionados.
Hemos añadido una opción que puede o no existir en nuestro modelo de servidor:
UNKNOWN
. Esto puede manejarse comoundefined
lo prefiere, pero me gusta evitar los| undefined
tipos siempre que sea posible para simplificar el manejo.Lo bueno de tener un
UNKNOWN
caso es que puede ser muy obvio al respecto en el código y hacer que los estilos para casos de enumeración desconocidos sean de color rojo brillante y parpadeante para que sepa que no está manejando algo correctamente.Analiza la enumeración
Es posible que esté utilizando esta enumeración incrustada en otro modelo, o solo, pero tendrá que analizar la enumeración escrita en cadena y desde JSON o XML (ha) en su contraparte fuertemente tipada. Cuando está incrustado en otro modelo, este analizador vive en el constructor de la clase.
Si la enumeración se analiza correctamente, terminará siendo del tipo adecuado. De lo contrario, lo será
undefined
y puede interceptarlo y devolver suUNKNOWN
caso. Si prefieres usarundefined
como su caso desconocido, puede devolver cualquier resultado del intento de análisis de enumeración.A partir de ahí, solo es cuestión de usar la función de análisis y usar su nueva variable de tipo fuerte.
fuente
IssueType["REPS"]="REPS"
. Si hubiera definido su enumeración un poco diferente, digamos,REPS="reps"
esto produciríaIssueType["REPS"]="reps"
lo que ...IssueType.UNKNOWN
porque no hay clavereps
en su enumeración. Lástima, todavía no encontré una solución funcional para esto, ya que mis cadenas contienen guiones que los hacen inutilizables como claves.Estaba buscando una respuesta que pueda obtener un
enum
de astring
, pero en mi caso, los valores de las enumeraciones tenían valores de cadena diferentes. El OP tenía una enumeración simpleColor
, pero tenía algo diferente:Cuando intenta resolver
Gender.CantTell
con una"Can't tell"
cadena, vuelveundefined
con la respuesta original.Otra respuesta
Básicamente, se me ocurrió otra respuesta, fuertemente inspirada por esta respuesta :
Notas
filter
, asumiendo que el cliente está pasando una cadena válida de la enumeración. Si no es el caso,undefined
será devuelto.enumObj
aany
, ya que con mecanografiado 3.0+ (en la actualidad el uso de mecanografiado 3.5), elenumObj
se resuelve comounknown
.Ejemplo de uso
Nota: Y, como alguien señaló en un comentario, también quería usar el
noImplicitAny
.Versión actualizada
Sin yeso
any
y tipificaciones adecuadas.Además, la versión actualizada tiene una forma más fácil de llamarlo y es más legible:
fuente
Necesitaba saber cómo recorrer valores de enumeración (estaba probando muchas permutaciones de varias enumeraciones) y descubrí que esto funcionaba bien:
Fuente: https://blog.mikeski.net/development/javascript/typescript-enums-to-from-string/
fuente
each
para probar cada caso de enumeración con un solo métodoEnum
Uso de la muestra
Ignorar el análisis de mayúsculas y minúsculas
fuente
return enumType[property];
un estuche cuando su elemento enumeración se parezcaSkills = "anyvalue"
Las enumeraciones creadas de la manera que lo hizo se compilan en un objeto que almacena asignaciones directas
(name -> value)
e inversas(value -> name)
. Como podemos observar en esta captura de pantalla de Chrome Devtools:Aquí hay un ejemplo de cómo funciona el mapeo dual y cómo transmitir de uno a otro:
fuente
Prueba esto
Eso funciona bien para la versión 3.5.3
fuente
Si está utilizando espacios de nombres para ampliar la funcionalidad de su enumeración, también puede hacer algo como
y úsalo así
fuente
otra variación puede ser
fuente