Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

234
Views
¿Es posible usar enumeraciones para restringir valores?

Podemos restringir fácilmente el valor admitido utilizando tipos literales como los siguientes

 type GenderConfig = { gender: 1 | 0 } const obj: GenderConfig = { gender: 100 // throw error because value is not 1 or 0 }

Ahora, en la medida de lo posible, me gustaría evitar los números mágicos 1 y 0 .

así que traté de definir una enumeración para eso

 enum Gender { MALE= 1, FEMALE=0, } type GenderConfig = { gender: Gender } const obj: GenderConfig = { gender: 100 // This doesn't throw error anymore? }

Enlace del patio de recreo

Sorprendentemente, gender: 100 ya no arroja un error que no entiendo la razón detrás de esto.

about 4 years ago · Juan Pablo Isaza
3 answers
Answer question

0

Lo que ha creado aquí es una enumeración numérica . El JavaScript generado se ve así:

 var Gender; (function (Gender) { Gender[Gender["MALE"] = 1] = "MALE"; Gender[Gender["FEMALE"] = 0] = "FEMALE"; })(Gender || (Gender = {}));

En la consola, este objeto se ve así:

 Object 0: "FEMALE" 1: "MALE" FEMALE: 0 MALE: 1

Debajo del capó, la enumeración es realmente solo un objeto de JavaScript con propiedades. Tiene las propiedades con nombre que definió y se les asigna un número que representa la posición en la enumeración en la que existen (Siendo FEMALE 0, MALE siendo 1), pero el objeto también tiene claves numéricas con un valor de cadena que representa la constante con nombre.

Por lo tanto, puede pasar números a una función que espera una enumeración. La enumeración en sí es tanto un número como una constante definida.

Esto parece anular el aspecto de tipo seguro de TypeScript, ya que puede pasar un número arbitrario a una función que espera esta enumeración. Sin embargo, hay dos razones por las que esto es útil:

  1. Cuando recibe datos numéricos (por ejemplo, en una carga JSON de algún servicio), puede convertirlos en una enumeración.
  2. Dado que los miembros de la enumeración tienen valores numéricos, también puede usarlos como indicadores de bits (aunque dado que puede establecer el valor numérico para cada miembro de la enumeración, como lo ha hecho aquí, esto puede funcionar bien o no).

Con respecto al punto (1): si declara una enumeración sin valores numéricos, por ejemplo, esto:

 enum Gender { MALE = "Male", FEMALE = "Female" }

entonces ya no puedes hacer esto:

 const gender: Gender = "Male";

Tendrás que hacer un reparto explícito:

 const gender = "Male" as Gender;
about 4 years ago · Juan Pablo Isaza Report

0

const MALE = 1; const FEMALE = 0; type Gender = typeof MALE | typeof FEMALE; type GenderConfig = { gender: Gender } const obj: GenderConfig = { gender: 100 // This is now throwing error }

Patio de juegos

En lugar de usar enums , lo cambié a type y al usar la combinación de const y typeof , puedo evitar el número mágico y mejorar la legibilidad y la consistencia, gracias a los demás por la explicación.

about 4 years ago · Juan Pablo Isaza Report

0

Ya no uso tanto las enumeraciones porque son un poco complicadas. Tal vez esto sea posible de alguna manera, pero puedes usar cadenas como esta en su lugar:

 type Gender = 'female' | 'male'; type GenderConfig = { gender: Gender }

Por supuesto, es posible que deba agregar algún mapeo si realmente necesita la representación numérica en algún momento.

about 4 years ago · Juan Pablo Isaza Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!