Skip to content

Modifier for bitflag enums #42521

Open
Open
@DanielRosenwasser

Description

@DanielRosenwasser

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    In DiscussionNot yet reached consensusSuggestionAn idea for TypeScript

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions