Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I guarantee that my enums definition doesn't change in JavaScript?

Tags:

javascript

Would the following make the objects fulfil all characteristics that enums have in JavaScript? Something like:

my.namespace.ColorEnum = {   RED : 0,   GREEN : 1,   BLUE : 2 }  // later on  if(currentColor == my.namespace.ColorEnum.RED) {   // whatever }  

Or is there some other way I can do this?

like image 722
David Citron Avatar asked Nov 13 '08 19:11

David Citron


People also ask

Can enums have the same value?

1. Two enum names can have same value. For example, in the following C program both 'Failed' and 'Freezed' have same value 0.

Can enum values be changed?

4) Enum constants are implicitly static and final and can not be changed once created.

What is the preferred syntax for defining enums in JavaScript?

The preferred syntax for defining enums in JavaScript is to use the objects see the code below:- var DaysEnum = Object. freeze({"monday":1, "tuesday":2, "wednesday":3, ...})

How do enums work JavaScript?

Enums are one of the few features TypeScript has which is not a type-level extension of JavaScript. Enums allow a developer to define a set of named constants. Using enums can make it easier to document intent, or create a set of distinct cases. TypeScript provides both numeric and string-based enums.


2 Answers

Since 1.8.5 it's possible to seal and freeze the object, so define the above as:

const DaysEnum = Object.freeze({"monday":1, "tuesday":2, "wednesday":3, ...}) 

or

const DaysEnum = {"monday":1, "tuesday":2, "wednesday":3, ...} Object.freeze(DaysEnum) 

and voila! JS enums.

However, this doesn't prevent you from assigning an undesired value to a variable, which is often the main goal of enums:

let day = DaysEnum.tuesday day = 298832342 // goes through without any errors 

One way to ensure a stronger degree of type safety (with enums or otherwise) is to use a tool like TypeScript or Flow.

Quotes aren't needed but I kept them for consistency.

like image 195
Artur Czajka Avatar answered Oct 10 '22 06:10

Artur Czajka


This isn't much of an answer, but I'd say that works just fine, personally

Having said that, since it doesn't matter what the values are (you've used 0, 1, 2), I'd use a meaningful string in case you ever wanted to output the current value.

like image 34
Gareth Avatar answered Oct 10 '22 06:10

Gareth