Buscando algún ejemplo más sobre unir o extender en enum, he encontrado esta:
enumDiasLaborales{Lunes='MON',Martes='TUE',Miercoles='WED',Jueves='THU',Viernes='FRI'}enumDiasFinSemana{Sabado='SAT',Domingo='SUN'}constSemana={...DiasLaborales,...DiasFinSemana}console.log(Semana.Lunes);// MONconsole.log(Semana.Sabado);// SAT
Ojo que ahí no se están extendiendo los enums en un nuevo enum... Simplemente se está creando un objeto con los pares key-value de los 2 enums.
La manera de extender un enum en TypeScript es simplemente asignando nuevos valores al enum que queremos extender, es decir:
Tomando en cuenta que es necesario reinicializar el primer elemento del segundo enum en continuación del primero.
.
Esto se puede lograr ya que una vez compilado nuestro código a JavaScript un enum no deja de ser un objeto literal, es por eso que se pueden asignar nuevos valores.
.
Fuente:
Enums are open ended - TypeScript Deep Dive
Number Enums and Strings - TypeScript Deep Dive
A muy bien, gracias.
La respuesta realmente correcta es esta, muchas gracias!
// Enum: permiten definir un conjunto de constantes con nombre// Orientacion para Fotografias// const landscape = 0;// const portrait = 1;// const square = 2;// const panorama = 3;enumPhotoOrientation{Landscape=0,// podemos darle valor de manera explicitaPortrait,// 1Square,// 2Panorama// 3}constlandscape:PhotoOrientation=PhotoOrientation.Landscape;console.log('landscape : ', landscape);// -> 0console.log('Landscape : ',PhotoOrientation[0]);// -> LandscapeenumPictureOrientation{Landscape=10,// 10Portrait,// 11Square,// 12Panorama// 13}console.log('porttrait : ',PictureOrientation.Portrait);// -> 11enumCountry{Bolivia='bol',Colombia='col',Mexico='mex',EEUU='usa',España='esp'}constcountry:Country=Country.Colombia;console.log('country : ', country);// --> col
Para unir o extender un enum de otro es de la siguiente manera.
Así testEnum tiene los valores de los dos anteriores Enum ya que en runtime se pueden combinar estos dos objetos. En Javascript se traduciría de la siguiente forma.
"use strict";varFirstEnum;(function(FirstEnum){FirstEnum["value1"]="value1";FirstEnum["value2"]="value2";})(FirstEnum||(FirstEnum={}));varSecondEnum;(function(SecondEnum){SecondEnum["value3"]="value3";SecondEnum["value4"]="value4";})(SecondEnum||(SecondEnum={}));let testEnum =Object.assign({},FirstEnum,SecondEnum);console.log(testEnum.value4);// value 4
Para el uso de assign se debe cambiar la especificación a:
"target":"es6"
Los enumerados permiten definir un conjunto de constantes con nombre
Tienen la ventaja de adapartse al contexto de la aplicación
Documentación oficial de enums en TS
//* Orientación para fotografías/* const landscape = 0
const portrait = 1
const square = 2
const panorama = 3 *///*Una forma más inteligente de declarar constantesenumPhotoOrientation{Landscape='cero',//* Podemos asignar un valor en particularPortrait=1,//* 1Square=2,//* 2Panorama=3//* 3}const landscape:PhotoOrientation=PhotoOrientation.Landscapeconst square:PhotoOrientation=PhotoOrientation.Squareconsole.log('landscape: ', landscape)//* Accede al valorconsole.log('Square: ',PhotoOrientation[square])//* Accede al nombre//*Siempre tenemos valores consecutivos que incrementan de 1 en 1enumPictureOrientation{Landscape=10,Portrait,//* 11Square,//* 12Panorama,// *13}console.log('Portrait: ',PictureOrientation.Portrait)//* valor 11//* Es la misma lógica que: { key, value }enumCountry{Bolivia='BOL',Colombia='COL',Mexico='MEX',EEUU='USA',Espana='ESP'}const mexico:Country=Country.Mexicoconsole.log('México: ', mexico)//! Country.Mexico = 'MX' //!Esto da un error, no podemos modificar su valor
Una recomendacion es que los enums por lo general van en mayusculas, dado que son constantes.
en la practica es como un objeto clave-valor.
Estoy de acuerdo he visto esa practica de manera real asignando la misma clave al valor que lleva para dejar el codigo mas legible.
Sï, un diccionario que guarda constantes.
Los Enum nos ayudan a escribir un código más legible.
Prácticamente esto es un Objeto que tiene como key los textos que declaramos y los indices que se autodefinen o definimos , ya que la salida de todo eso es
Yo pensé lo mismo pero tiene varias ventajas como que puedes agregarle el tipado "Country" por ejemplo
constcountry:Country
entiendo lo que comentas raulmar en esencia el enum es como un objeto
Para que se usa el tipo de dato Enum o a que hace refencia , me confundi un poco con este tipo de dato?
Enum es un conjunto de constantes.
Ejemplo:
Enum de constantes matemáticas
enumMathConst{Pi=3.14,e =2,71}
Básicamente es un tipo de dato que se usa para agrupar constantes que tienen una relación entre si.
ooww muchas gracias jaja :D
Todavía no me queda claro cuando usarlos, he leido pero no me termina de parece usable
Supongo que son para casos donde necesitas limitar la cantidad de variables. Me explico. Imagina una app en la que pueden haber tres tipos de suscriptores: free, pro, pro+. Usarías un enum para definirlos. Si querés hacer validaciones no tenés que fijarte si escribiste las variables de forma correcta. Simplemente usas el enum.
O así me lo imagino yo, soy nueva en TS pero me pareció un caso útil.
Los enum en Typescript funcionan igual que en swift, si declaras:
es decir, si inicializas con un valor "custom" el primer enumerado los demas se "enumeran" a partir de ese valor que se le asigna
en enum generalmente no sabemos los valores numéricos asociados, por lo tanto si queremos saber el nombre que representa, entonces lo haríamos así, sin saber el número asociado:
Enum, conjunto de constantes con nombre. Es darle a una variable un nombre con un valor numérico. Con un índice se ve el estado del enumerado. Se pueden personalizar los índices asignandoles un valor.
Si presentas el siguiente problema:
"SyntaxError: Unexpected reserved word on typescript"
al momento de ejecutar tu archivo type-enum.js con node, instala lo siguiente:
npm i -g ts-node
y para compilar tu archivo .ts y ejecutarlo a la vez solo necesitas ejecutar el comando junto con su archivo de TypeScript:
ts-node type-enum.ts
Ello te permitirá ejecutar directamente tu archivo .ts sin tener que llamar a node de forma manual y así evitar el error que te está apareciendo.
Noté que cuando asignas un valor de tipo distinto a numero a los atributos de enum ya no puedes acceder a ellos con corchetes [] como lo que hizo el profesor al principio en la parte de:
enumPhotoOrientation{Landsacape='Un string',...}console.log(PhotoOrientation[0])//Marca error de tipos
Esto genera un error, alguien me podría explicar por qué es así por favor 🙏🏼
Hola Alberto,
.
Por lo que pude entender y consultar en internet, lo que se ingresa dentro de los [ ] no son índices, sino los valores de las constantes dentro del enum y solo aplica para tipos numéricos. En el caso de PhotoOrientation, si no le asignas un valor a la LANDSACAPE (que por cierto la constante se ha de escribir en mayúscula) esta por defecto adquiere el valor de 0 y las demás constantes se incrementan en 1. Así, si la primera constante la inicias en 7, las siguientes adquieren el valor de 8, 9, 10, etc.
.
Entonces, al invocar PhotoOrientation[0] lo que estas haciendo es consultar dentro del enum una constante cuya asignación o valor sea 0 y esta consulta retornara el nombre de la constante.
.
Igualmente al invocar PhotoOrientation.LANDSACAPE la consulta retornara la asignación o valor de una constante con este nombre y que en este caso seria 0.
Muchas gracias por la aclaración mecato :D
Algo a tener en cuenta es que si no colocas un identificador o llave para los elementos del enum se pueden duplicar cuando les hagas merge.