Open DanielRosenwasser opened 3 years ago
This sounds like #21598.
It is pretty similar! The difference is that this modifier is really just a hint for some sort of strictness flag. It has no runtime impact.
I like this! I would try to give a prototype.
Consider the following code
If a user tries to pass along the expression
ScriptKind.JSX | ScriptKind.TSX
to a parameter that expects aScriptKind
, then will end up constructing a value equal toScriptKind.JSON
.Really, the user should have been told that this enum wasn't intended to be used in bitwise operations! But unfortunately, TypeScript doesn't catch this because you can assign any number to any numeric enum.
One could imagine a mode that prevents both the construction and the assignment for certain enums. In this mode, an enum has to be declared with the
bitflags
modifier if it wants to opt in to these types of bitwise operations, and to allownumber
to be assignable to that enum.Alternatively, this could be something more akin to
/** @deprecated */
or/** @internal */
.This is in some part inspired by Rust's
bitflags
macro.