Closed
Description
Suggestion
π Search Terms
enum, compile
β Viability Checklist
My suggestion meets these guidelines:
- This wouldn't be a breaking change in existing TypeScript/JavaScript code
- This wouldn't change the runtime behavior of existing JavaScript code
- This could be implemented without emitting different JS based on the types of the expressions
- This isn't a runtime feature (e.g. library functionality, non-ECMAScript syntax with JavaScript output, new syntax sugar for JS, etc.)
- This feature would agree with the rest of TypeScript's Design Goals.
β Suggestion
An improved compiler for enums
π Motivating Example
I have an enum like this:
enum State {
WAIT_FOR_OPEN_WEB_SOCKET,
WAIT_FOR_REGISTER_RESPONSE,
CONNECTED,
DISCONNECTED,
}
And so does it compile:
var State;
(function (State) {
State[State["WAIT_FOR_OPEN_WEB_SOCKET"] = 0] = "WAIT_FOR_OPEN_WEB_SOCKET";
State[State["WAIT_FOR_REGISTER_RESPONSE"] = 1] = "WAIT_FOR_REGISTER_RESPONSE";
State[State["CONNECTED"] = 2] = "CONNECTED";
State[State["DISCONNECTED"] = 3] = "DISCONNECTED";
})(State || (State = {}));
It would save much code when it would get compiled this:
var State;
(function (State) {
State[State[0] = "WAIT_FOR_OPEN_WEB_SOCKET"] = 0;
State[State[1] = "WAIT_FOR_REGISTER_RESPONSE"] = 1;
State[State[2] = "CONNECTED"] = 2;
State[State[3] = "DISCONNECTED"] = 3;
})(State || (State = {}));
π» Use Cases
Much smaller compiled code
I calculated how much characters it would save on an example from my code:
From 1177 to 849 characters (328 less or ~28% decrease)
var Event;
(function (Event) {
Event[Event["DID_RECEIVE_SETTINGS"] = 0] = "DID_RECEIVE_SETTINGS";
Event[Event["DID_RECEIVE_GLOBAL_SETTINGS"] = 1] = "DID_RECEIVE_GLOBAL_SETTINGS";
Event[Event["KEY_DOWN"] = 2] = "KEY_DOWN";
Event[Event["KEY_UP"] = 3] = "KEY_UP";
Event[Event["WILL_APPEAR"] = 4] = "WILL_APPEAR";
Event[Event["WILL_DISAPPEAR"] = 5] = "WILL_DISAPPEAR";
Event[Event["TITLE_PARAMETERS_DID_CHANGE"] = 6] = "TITLE_PARAMETERS_DID_CHANGE";
Event[Event["DEVICE_DID_CONNECT"] = 7] = "DEVICE_DID_CONNECT";
Event[Event["DEVICE_DID_DISCONNECT"] = 8] = "DEVICE_DID_DISCONNECT";
Event[Event["APPLICATION_DID_LAUNCH"] = 9] = "APPLICATION_DID_LAUNCH";
Event[Event["APPLICATION_DID_TERMINATE"] = 10] = "APPLICATION_DID_TERMINATE";
Event[Event["SYSTEM_DID_WAKE_UP"] = 11] = "SYSTEM_DID_WAKE_UP";
Event[Event["PROPERTY_INSPECTOR_DID_APPEAR"] = 12] = "PROPERTY_INSPECTOR_DID_APPEAR";
Event[Event["PROPERTY_INSPECTOR_DID_DISAPPEAR"] = 13] = "PROPERTY_INSPECTOR_DID_DISAPPEAR";
Event[Event["SEND_TO_PLUGIN"] = 14] = "SEND_TO_PLUGIN";
Event[Event["SEND_TO_PROPERTY_INSPECTOR"] = 15] = "SEND_TO_PROPERTY_INSPECTOR";
})(Event || (Event = {}));
var Event;
(function (Event) {
Event[Event[0] = "DID_RECEIVE_SETTINGS"] = 0;
Event[Event[1] = "DID_RECEIVE_GLOBAL_SETTINGS"] = 1;
Event[Event[2] = "KEY_DOWN"] = 2;
Event[Event[3] = "KEY_UP"] = 3;
Event[Event[4] = "WILL_APPEAR"] = 4;
Event[Event[5] = "WILL_DISAPPEAR"] = 5;
Event[Event[6] = "TITLE_PARAMETERS_DID_CHANGE"] = 6;
Event[Event[7] = "DEVICE_DID_CONNECT"] = 7;
Event[Event[8] = "DEVICE_DID_DISCONNECT"] = 8;
Event[Event[9] = "APPLICATION_DID_LAUNCH"] = 9;
Event[Event[10] = "APPLICATION_DID_TERMINATE"] = 10;
Event[Event[11] = "SYSTEM_DID_WAKE_UP"] = 11;
Event[Event[12] = "PROPERTY_INSPECTOR_DID_APPEAR"] = 12;
Event[Event[13] = "PROPERTY_INSPECTOR_DID_DISAPPEAR"] = 13;
Event[Event[14] = "SEND_TO_PLUGIN"] = 14;
Event[Event[15] = "SEND_TO_PROPERTY_INSPECTOR"] = 15;
})(Event || (Event = {}));
From 849 to 569 characters (280 less or ~33% decrease) (on minified code)
var E;!function(E){E[E.DID_RECEIVE_SETTINGS=0]="DID_RECEIVE_SETTINGS",E[E.DID_RECEIVE_GLOBAL_SETTINGS=1]="DID_RECEIVE_GLOBAL_SETTINGS",E[E.KEY_DOWN=2]="KEY_DOWN",E[E.KEY_UP=3]="KEY_UP",E[E.WILL_APPEAR=4]="WILL_APPEAR",E[E.WILL_DISAPPEAR=5]="WILL_DISAPPEAR",E[E.TITLE_PARAMETERS_DID_CHANGE=6]="TITLE_PARAMETERS_DID_CHANGE",E[E.DEVICE_DID_CONNECT=7]="DEVICE_DID_CONNECT",E[E.DEVICE_DID_DISCONNECT=8]="DEVICE_DID_DISCONNECT",E[E.APPLICATION_DID_LAUNCH=9]="APPLICATION_DID_LAUNCH",E[E.APPLICATION_DID_TERMINATE=10]="APPLICATION_DID_TERMINATE",E[E.SYSTEM_DID_WAKE_UP=11]="SYSTEM_DID_WAKE_UP",E[E.PROPERTY_INSPECTOR_DID_APPEAR=12]="PROPERTY_INSPECTOR_DID_APPEAR",E[E.PROPERTY_INSPECTOR_DID_DISAPPEAR=13]="PROPERTY_INSPECTOR_DID_DISAPPEAR",E[E.SEND_TO_PLUGIN=14]="SEND_TO_PLUGIN",E[E.SEND_TO_PROPERTY_INSPECTOR=15]="SEND_TO_PROPERTY_INSPECTOR"}(E||(E={}));
var E;!function(E){E[E[0]="DID_RECEIVE_SETTINGS"]=0,E[E[1]="DID_RECEIVE_GLOBAL_SETTINGS"]=1,E[E[2]="KEY_DOWN"]=2,E[E[3]="KEY_UP"]=3,E[E[4]="WILL_APPEAR"]=4,E[E[5]="WILL_DISAPPEAR"]=5,E[E[6]="TITLE_PARAMETERS_DID_CHANGE"]=6,E[E[7]="DEVICE_DID_CONNECT"]=7,E[E[8]="DEVICE_DID_DISCONNECT"]=8,E[E[9]="APPLICATION_DID_LAUNCH"]=9,E[E[10]="APPLICATION_DID_TERMINATE"]=10,E[E[11]="SYSTEM_DID_WAKE_UP"]=11,E[E[12]="PROPERTY_INSPECTOR_DID_APPEAR"]=12,E[E[13]="PROPERTY_INSPECTOR_DID_DISAPPEAR"]=13,E[E[14]="SEND_TO_PLUGIN"]=14,E[E[15]="SEND_TO_PROPERTY_INSPECTOR"]=15}(E||(E={}));