Description
Consider the following code
export enum ScriptKind {
Unknown = 0,
JS = 1,
JSX = 2,
TS = 3,
TSX = 4,
External = 5,
JSON = 6,
}
If a user tries to pass along the expression ScriptKind.JSX | ScriptKind.TSX
to a parameter that expects a ScriptKind
, then will end up constructing a value equal to ScriptKind.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 allow number
to be assignable to that enum.
bitflags enum SymbolFlags {
// ...
}
Alternatively, this could be something more akin to /** @deprecated */
or /** @internal */
.
/// @bitflags
enum SymbolFlags {
// ...
}
This is in some part inspired by Rust's bitflags
macro.