Skip to content

The values of the traversable enum generate the union type #40691

Closed
@victorykong

Description

@victorykong

Search Terms

enum
keyof
typeof

Use Cases

type num = VALUE.ZERO | VALUE.ONE | VALUE.TWO;
const number0: num = 0;
const number1: num = 1;
const number2: num = 2;
const number3: num = 3; // Success??

Examples

How do I define a type constraint in my enumeration value?

enum VALUE {
  ZERO,
  ONE,
  TWO,
}
type KEY = keyof typeof VALUE; // "ZERO" | "ONE" | "TWO"

Activity

jgbpercy

jgbpercy commented on Sep 22, 2020

@jgbpercy

Sadly the enum feature in TS doesn't achieve what you want here, assuming I'm understanding what you're asking. You can do something like this:

export const VALUE = {
    ZERO: 0,
    ONE: 1,
    TWO: 2
} as const;

type ValueType = typeof VALUE;

type Value = ValueType[keyof ValueType];

const One: Value = 1; // Ok

const Three: Value = 3; // Error

The flaw with the above is that nothing stops you from using values from other "enums" as the type Value (if their numerical value is 0, 1 or 2). For that, you would need some version of branded types.

Btw if your enum values don't come from some external source that forces them to be integers, string literal unions are often a better idea for reasons like the above.

RyanCavanaugh

RyanCavanaugh commented on Sep 22, 2020

@RyanCavanaugh
Member

Unclear if this is a bug report or a question; see #26362

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    DuplicateAn existing issue was already created

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

      Development

      No branches or pull requests

        Participants

        @RyanCavanaugh@jgbpercy@victorykong

        Issue actions

          The values of the traversable enum generate the union type · Issue #40691 · microsoft/TypeScript