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:

How to build agentic frontend applications with CopilotKit

Build context-aware, agentic frontend applications by connecting React state and actions to LLMs with CopilotKit.

Emmanuel John
Feb 3, 2026 ⋅ 5 min read

Dokploy vs Coolify: Why Dokploy wins in production

A hands-on comparison of Dokploy and Coolify, explaining why self-hosted, Docker-based PaaS tools offer more control, predictable costs, and production clarity.

Chinwike Maduabuchi
Feb 3, 2026 ⋅ 10 min read
Shadcn Ui Component Collection Adoption Guide: Overview, Examples, And Alternatives

Shadcn UI adoption guide: Overview, examples, and alternatives

Explore Shadcn UI, a reusable component collection. See its features, pros, cons, and more to determine if you should use it in your project.

Nefe Emadamerho-Atori
Feb 2, 2026 ⋅ 8 min read
Cache components in Next.js: Faster pages with partial pre-rendering

Cache components in Next.js: Faster pages with partial pre-rendering

Cache components change how rendering decisions are made in Next.js, allowing static and dynamic UI to coexist on the same page without blocking the initial render.

Temitope Oyedele
Jan 30, 2026 ⋅ 8 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

Hey there, want to help make our blog better?

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