Los enums se utilizan en la mayoría de los lenguajes de programación orientados a objetos como Java y C# y ahora también están disponibles en TypeScript. Son una de las pocas características de TypeScript que no es una extensión a nivel de tipo de JavaScript.
Los Enums permiten definir un conjunto de constantes con nombre. Su uso facilita la documentación de la intención o la creación de un conjunto de casos distintos. Hoy, exploraremos los fundamentos de los enums de TypeScript junto con los casos de uso, varios tipos de enum, y los próximos pasos para su aprendizaje.
¿Qué es un enum en Typescript?
Los enums de TypeScript permiten definir un conjunto de constantes con nombre. Su uso puede facilitar la documentación de la intención o la creación de un conjunto de casos distintos. Muchos lenguajes de programación, como C, C# y Java, tienen un tipo de datos enum, pero JavaScript no. Sin embargo, TypeScript sí lo tiene. TypeScript tiene enums tanto numéricos como basados en cadenas.
La sintaxis de los enums es la siguiente:
enum States {
Oregon,
Washington,
Idaho,
Montana,
Wyoming
}
// usage
var region = States.Washington;
Antes de ver más de cerca algunos tipos de enum, vamos a discutir los beneficios de los enum en TypeScript.
¿Por qué usar enums en TypeScript?
Los enums son una gran manera de organizar tu código en TypeScript. Veamos algunas ventajas:
- Proporciona flexibilidad haciendo más fácil expresar y documentar intenciones y casos de uso
- Ahorra tiempo de compilación y de ejecución con el código inline en JavaScript
Permite la creación de constantes personalizadas de memoria eficiente en JavaScript.
Enums numéricas
Las enumeraciones numéricas almacenan los valores de las cadenas como números. Pueden definirse utilizando la palabra clave enum
. Digamos que quieres almacenar un conjunto de diferentes tipos de coches. El siguiente ejemplo muestra un enum numérico en TypeScript:
enum CarType {
Honda,
Toyota,
Subaru,
Hyundai
}
El valor enum CarType
tiene cuatro valores: Honda, Toyota, Subaru y Hyundai. Los valores del enum empiezan por cero y se incrementan en uno para cada miembro, lo que tendría un aspecto similar al siguiente:
Honda = 0
Toyota = 1
Subaru = 2
Hyundai = 3
Si quieres, puedes inicializar tú mismo el primer valor numérico de esta manera:
enum CarType {
Honda = 1,
Toyota,
Subaru,
Hyundai
}
En el ejemplo anterior, hemos inicializado el primer miembro Honda con el valor numérico de uno. Los números restantes se incrementarán en uno.
Nota: No es necesario asignar valores secuenciales a los miembros de su enum. Puedes asignarles los valores que quieras.
Enumeraciones de cadenas
Los enums de cadena son similares a los enums numéricos, pero sus valores enum se inicializan con valores de cadena en lugar de valores numéricos. Las enumeraciones de cadena son más legibles que las numéricas, lo que facilita la depuración de los programas.
El siguiente ejemplo utiliza la misma información que el ejemplo de enum numérico, pero se representa como un enum de cadena:
enum CarType {
Honda = "HONDA",
Toyota = "TOYOTA",
Subaru = "SUBARU",
Hyundai = "HYUNDAI"
}
// Access String Enum
CarType.Toyota; //returns TOYOTA
CarType['Honda']; //returns HONDA
En el ejemplo, definimos el enum de cadena CarType
con los mismos valores que el enum numérico, excepto que los valores del enum se inicializan como literales de cadena.
Nota: Los valores del enum de las cadenas deben ser inicializados individualmente.
Enums heterogéneas
Los enums heterogéneos contienen tanto valores numéricos como de cadena. He aquí un ejemplo:
enum BooleanHeterogeneousEnum {
Yes = 0,
No = "NO",
}
Mapeo inverso con enums
Ya sabes que los valores numéricos se pueden recuperar utilizando sus correspondientes valores de miembro de enum. Con el mapeo inverso, puedes acceder al valor de un miembro y a un nombre de miembro a partir de su valor. Veamos un ejemplo:
enum CarType {
Honda = 1,
Toyota,
Subaru,
Hyundai
}
CarType.Subaru; // returns 3
CarType["Subaru"]; // returns 3
CarType[3]; // returns Subaru
CarType[3]
devuelve su nombre de miembro "Subaru" debido al mapeo inverso. Veamos otro ejemplo:
enum CarType {
Honda = 1,
Toyota,
Subaru,
Hyundai
}
console.log(CarType)
Verás la siguiente salida en la consola de tu navegador:
{
'1': 'Honda',
'2': 'Toyota',
'3': 'Subaru',
'4': 'Hyundai',
Honda: 1,
Toyota: 2,
Subaru: 3,
Hyundai: 4
}
Cada valor del enum aparece dos veces en el objeto enum almacenado internamente.
Enums const
Puedes utilizar const enums para mejorar el rendimiento de tus enums numéricos. Se definen utilizando el parámetro
const enum Enum {
X = 1
Y = X * 2,
}
A diferencia de los enums regulares, los enums const se eliminan completamente durante la compilación. Sólo pueden utilizar expresiones constantes de enum y se inlinean en los sitios de uso.
Enums computed
El valor de un miembro de un enum puede ser un valor constante o un valor computado. El siguiente ejemplo incluye valores computados:
enum CarType {
Honda = 1,
Toyota = getCarTypeCode('toyota'),
Subaru = Toyota * 3,
Hyundai = 10
}
function getCarTypeCode(carName: string): number {
if (carName === 'toyota') {
return 5;
}
}
CarType.Toyota; // returns 5
CarType.Subaru; // returns 15
Si el enum incluye miembros computados y constantes, los miembros del enum no inicializados van primero o después de otros miembros inicializados con constantes numéricas. El siguiente ejemplo mostrará un error:
enum CarType {
Toyota = getCarTypeCode('toyota'),
Honda, // Error: Enum member must have initializer
Subaru,
Hyundai = Toyota * 3,
}
Puedes declarar el enum anterior así:
enum CarType {
Honda,
Hyundai,
Toyota = getCarTypeCode('toyota'),
Subaru = Toyota * 3
En un breve resumen de los temas abordados:
- La forma corta de enumeración es enum.
- Se utiliza como un tipo con algún conjunto de valores llamado constante con nombre.
- Internamente contiene valores de tipo numérico o en algunos casos podemos crear enums heterogéneos.
- La palabra clave enum se utiliza para definir los enums.
- Podemos crear un caso distinto por lo que facilita la documentación.
- Nos obliga a utilizar todos los valores posibles.
- Se puede acceder a los enums usando el índice o usando el operador punto después del nombre del enum y la constante nombrada.
- El valor inicial parte de 0 si no establecemos ningún valor.
- Auto incremental es el mejor enfoque a utilizar porque no necesitamos preocuparnos por los valores.