El siguiente código se puede usar para crear un enum
en TypeScript:
enum e {
hello = 1,
world = 2
};
Y se puede acceder a los valores mediante:
e.hello;
e.world;
¿Cómo creo un enum
con valores de cadena?
enum e {
hello = "hello", // error: cannot convert string to e
world = "world" // error
};
typescript
FacePalm
fuente
fuente
Respuestas:
TypeScript 2.4
Ahora tiene enumeraciones de cadena, por lo que su código simplemente funciona:
🌹
TypeScript 1.8
Desde TypeScript 1.8 puede usar tipos literales de cadena para proporcionar una experiencia confiable y segura para valores de cadena con nombre (que es en parte para lo que se utilizan las enumeraciones).
Más : https://www.typescriptlang.org/docs/handbook/advanced-types.html#string-literal-types
Soporte heredado
Las enumeraciones en TypeScript están basadas en números.
Sin embargo, puede usar una clase con miembros estáticos:
También puedes ir simple:
Actualización: según el requisito de poder hacer algo como
var test:E = E.hello;
lo siguiente, esto satisface:fuente
toString(): string { return this.value; }
toString
devuelve una cadena, ya que devuelvethis.value
yvalue
es de tipo cadena. Por lo tanto, no puede hacerlovar x:number = E.hello.toString();
y si lo hace,var x = E.hello.toString();
x también se considera que es de tipostring
:)get()
métodoreturn this.value
? De esa manera, devolverá el valor de la cadena cada vez que se acceda y no solo al convertirtoString()
.value
miembros en todos los tipos y los tratará como tipos comparables. Sin embargo, puede hacer que elvalue
miembro sea privado. De esta forma, el compilador no lo verá y no intentará aplicar la tipificación estructural.En la última versión (1.0RC) de TypeScript, puede usar enumeraciones como esta:
Actualización 1
Para obtener el valor numérico del miembro enum del valor de cadena, puede usar esto:
Actualización 2
En el último TypeScript 2.4, se introdujeron enumeraciones de cadena, como esta:
Para obtener más información sobre TypeScript 2.4, lea el blog en MSDN .
fuente
States[str]
no funciona hoy en día.Type 'string' is not assignable to type 'States'
States[str as any]
para hacer en la versión actual (2.x) de Typecript.TypeScript 2.4+
Ahora puede asignar valores de cadena directamente a los miembros de enumeración:
Ver # 15486 para más información.
TypeScript 1.8+
En TypeScript 1.8+, puede crear un tipo literal de cadena para definir el tipo y un objeto con el mismo nombre para la lista de valores. Imita el comportamiento esperado de una cadena de enumeración.
Aquí hay un ejemplo:
Que funcionará como un enum de cadena:
¡Asegúrese de escribir todas las cadenas en el objeto! Si no lo hace, en el primer ejemplo anterior, la variable no se escribiría implícitamente
MyStringEnum
.fuente
En TypeScript 0.9.0.1, aunque se produce un error del compilador, el compilador aún puede compilar el archivo ts en el archivo js. El código funciona como esperábamos y Visual Studio 2012 puede admitir la finalización automática del código.
Actualización:
En sintaxis, TypeScript no nos permite crear una enumeración con valores de cadena, pero podemos hackear el compilador: p
Patio de recreo
fuente
case Link.LEARN:
, obtendrá unCannot convert 'Link.LEARN' to 'string'
error de compilación. El casting no funcionará.TypeScript 2.1 +
Los tipos de búsqueda , introducidos en TypeScript 2.1, permiten otro patrón para simular enumeraciones de cadenas:
TypeScript 2.4 +
Con la versión 2.4, TypeScript introdujo el soporte nativo para las enumeraciones de cadenas, por lo que la solución anterior no es necesaria. De los documentos de TS:
fuente
Colors["RED"]
no funcionará. Alguna idea de cómo resolver esto (requerido para la conversión JSON).¿Por qué no utilizar la forma nativa de acceder a las cadenas de una enumeración?
fuente
enum Why { Because = "You Can't", Always = "Do Things That Way." }
;)Puede usar enumeraciones de cadenas en el último TypeScript:
Fuente: https://blog.rsuter.com/how-to-implement-an-enum-with-string-values-in-typescript/
ACTUALIZACIÓN - 2016
Una forma un poco más robusta de hacer un conjunto de cadenas que utilizo para React en estos días es así:
fuente
<string>e.hello
desencadena un error.e.hello
todavía es considerado como un número por el compilador.<number>e.hello
funciona sin embargo. ¿Hay alguna forma de evitar esto? Todo lo que puedo pensar es<string><any>e.hello
.enum Test { a = <any>"b", b = <any>"c", c = <any>"a" }
Test.a === 'c'
<any>
<string>
someStringValue == someEnumValue.toString()
Aquí hay una solución bastante limpia que permite la herencia, usando TypeScript 2.0. No probé esto en una versión anterior.
Prima: el valor puede ser de cualquier tipo!
fuente
Una manera hacky de esto es: -
CallStatus.ts
Utils.ts
Cómo utilizar
fuente
Esto funciona para mi:
o
8)
Actualización: poco después de publicar esto descubrí otra forma, pero olvidé publicar una actualización (sin embargo, alguien ya lo mencionó anteriormente):
fuente
Acabo de declarar una interfaz y uso una variable de ese tipo para acceder a la enumeración. Mantener la interfaz y la enumeración sincronizadas es realmente fácil, ya que TypeScript se queja si algo cambia en la enumeración, así.
La ventaja de este método es que no se requiere conversión de tipos para usar la enumeración (interfaz) en diversas situaciones, y por lo tanto, se admiten más tipos de situaciones, como el interruptor / caso.
El uso de la variable, en lugar de la enumeración, produce los resultados deseados.
Las banderas eran otra necesidad para mí, así que creé un módulo NPM que se suma a este ejemplo e incluye pruebas.
https://github.com/djabraham/ts-enum-tools
fuente
export default EAbFlagEnum as IAbFlagEnum;
lugar de redeclarar una variable. También eliminé el<any>
yeso en la enumeración, funciona bien.ACTUALIZACIÓN: TypeScript 3.4
Simplemente puede usar
as const
:TypeScript 2.1
Esto también se puede hacer de esta manera. Espero que ayude a alguien.
fuente
Con transformadores personalizados ( https://github.com/Microsoft/TypeScript/pull/13940 ) que está disponible en typescript @ next, puede crear una enumeración como objeto con valores de cadena de tipos literales de cadena.
Por favor revise mi paquete npm, ts-transformer-enumerate .
Ejemplo de uso:
fuente
TypeScript <2.4
de https://basarat.gitbooks.io/typescript/docs/types/literal-types.html
Para el enlace de origen, puede encontrar formas más y más fáciles de lograr el tipo literal de cadena
fuente
Hay muchas respuestas, pero no veo ninguna solución completa. El problema con la respuesta aceptada, así como también
enum { this, one }
, es que dispersa el valor de cadena que está utilizando a través de muchos archivos. Realmente tampoco me gusta la "actualización", es compleja y no aprovecha los tipos también. Creo que la respuesta de Michael Bromley es muy correcta, pero su interfaz es un poco molesta y podría funcionar con un tipo.Estoy usando TypeScript 2.0. * Esto es lo que haría
let greet: Greeting = Greeting.hello
También tiene información mucho mejor sobre el tipo / desplazamiento al usar un IDE útil. El inconveniente es que tienes que escribir las cadenas dos veces, pero al menos solo está en dos lugares.
fuente
La respuesta de @basarat fue genial. Aquí está un ejemplo simplificado pero un poco extendido que puede usar:
fuente
Enfrenté este problema recientemente con TypeScript 1.0.1 y lo resolvió de esta manera:
fuente
Creo que deberías intentar con esto, en este caso el valor de la variable no cambiará y funciona como enums, usar como una clase también funciona, la única desventaja es que por error puedes cambiar el valor de la variable estática y eso es lo que No queremos en enumeraciones.
fuente
fuente
fuente
Pequeño js-hacky pero funciona:
e[String(e.hello)]
fuente
Si lo que desea es principalmente una depuración fácil (con una verificación de tipo bastante) y no necesita especificar valores especiales para la enumeración, esto es lo que estoy haciendo:
Si desea admitir el almacenamiento de código / datos heredados, puede conservar las teclas numéricas.
De esta manera, puede evitar escribir los valores dos veces.
fuente
Muy, muy, muy simple Enum con cadena (TypeScript 2.4)
fuente
He intentado en TypeScript 1.5 como a continuación y me ha funcionado
fuente
Estaba buscando una manera de implementar descripciones en enumeraciones mecanografiadas (v2.5) y este patrón funcionó para mí:
...
fuente
TypeScript 0.9.0.1
Zona de juegos de TypeScript
fuente
Cannot convert 'string' to 'e'.
.