I've seen pure JS enums like {'dev' : Symbol('dev'), 'prod' : etc} but I never use them because you can't send them over the wire.
You could use a type like {dev:true} | {prod:true} | {stage:true} but you still wind up comparing strings.
This can't be accessed safely. Because all value in typescript can be sub type of how it typed.
It means code following will pass.
var a = { dev: true, get prod() { throw Error() } } var b: { dev:true } | {prod:true} | {stage:true} = a
> Type '{ dev: boolean; readonly prod: void; }' is not assignable to type '{ prod: true; }'
It's still a bad solution though; it allows nonsense values like {dev:true, prod:true}.
I've seen pure JS enums like {'dev' : Symbol('dev'), 'prod' : etc} but I never use them because you can't send them over the wire.
You could use a type like {dev:true} | {prod:true} | {stage:true} but you still wind up comparing strings.