Enums are fine, just don't forget to use Object.freeze(enumName) afterwards!!
Apart from that, because Typescript has powerful union types, not using enum is perfectly fine as well, for example instead of:
enum Relation { Less = -1, Equal, Greater }
Object.freeze(Relation);
you could do instead: const Less = -1;
type Less = -1;
const Equal = 0;
type Equal = 0;
const Greater = 1;
type Greater = 1;
type Relation = Less | Equal | Greater;
Apparently you need the additional "type Less" etc. declarations, I would have thought it should work without.As for private and #, the biggest disadvantage of # is that it is so slow currently. But that will change hopefully soon when # is not compiled as WeakMaps by TypeScript. I would hope they compile private to # later on, backwards compatibility be damned :-D