2024-08-15
1785
#typescript
Kealan Parr
121310
Aug 15, 2024 ⋅ 6 min read

How to extend enums in TypeScript

Kealan Parr Software engineer, technical writer and member of the Unicode Consortium.

Recent posts:

chatgpt atlas for developers featured image

How to use ChatGPT Atlas for frontend debugging, testing, and more

Learn how ChatGPT’s new browser Atlas fits into a frontend developer’s toolkit, including the debugging and testing process.

Emmanuel John
Nov 20, 2025 ⋅ 10 min read

Why composition – not reactivity – leads UI’s future

Users don’t think in terms of frontend or backend; they just see features. This article explores why composition, not reactivity, is becoming the core organizing idea in modern UI architecture.

Oscar Jite-Orimiono
Nov 20, 2025 ⋅ 6 min read
the replay nov 19

The Replay (11/19/25): React 19.2 async, GitHub Octoverse, and more

Discover what’s new in The Replay, LogRocket’s newsletter for dev and engineering leaders, in the November 19th issue.

Matt MacCormack
Nov 19, 2025 ⋅ 33 sec read

React 19.2: The async shift is finally here

Jack Herrington writes about how React 19.2 rebuilds async handling from the ground up with use(), , useTransition(), and now View Transitions.

Jack Herrington
Nov 19, 2025 ⋅ 5 min read
View all posts

2 Replies to "How to extend enums in TypeScript"

  1. >In the above code block, we used an intersection type. The intersection acts like an “or,” which simply means that the DoorState type will either be of type Door or of type DoorFrame.

    Isn’t that a union type? Although, the resultant type will let code only compile if the type is used such that only properties in the *intersection* of the types being unioned is accessed.

  2. > Can you extend enums?
    > The short answer is no, you can’t extend enums because TypeScript offers no language feature to > extend them.

    Depends on what you mean by “extend”… but either way, this sentence is pretty falsy. You might not be able to use an `extends` heritage clause as you would with interfaces or classes, but enums are subject to declaration merging in the same manner as namespaces (both `namespace` and the legacy `module` keyword), and interfaces/classes (at the type-level).

    You can also extend the functionality of an enum with static methods, in the same way you would by defining a namespace with the same name as an existing class or function to add types or static methods/properties.

    Here’s a brief real world example:
    “`ts
    // svg path segment commands
    enum Command {
    MoveToAbs = “M”,
    MoveToRel = “m”,
    LineToAbs = “L”,
    LineToRel = “l”,
    // …
    }

    namespace Command {
    // adding types, available as `Command.Absolute` or `Command.Relative`:
    export type Absolute = Command.MoveToAbs | Command.LineToAbs;
    export type Relative = Command.MoveToRel | Command.LineToRel;

    // add runtime functionality with type guards
    export function isAbsolute(it: unknown): it is Absolute {
    return it === Command.MoveToAbs || it === Command.LineToAbs;
    }

    export function isRelative(it: unknown): it is Relative {
    return it === Command.MoveToRel || it === Command.LineToRel;
    }
    }
    “`

Leave a Reply

Would you be interested in joining LogRocket's developer community?

Join LogRocket’s Content Advisory Board. You’ll help inform the type of content we create and get access to exclusive meetups, social accreditation, and swag.

Sign up now