The keyword extends can be used for interfaces and classes only.

If you just want to declare a type that has additional properties, you can use intersection type:

type UserEvent = Event & {UserId: string}

UPDATE for TypeScript 2.2, it's now possible to have an interface that extends object-like type, if the type satisfies some restrictions:

type Event = {
   name: string;
   dateCreated: string;
   type: string;
}

interface UserEvent extends Event {
   UserId: string; 
}

It does not work the other way round - UserEvent must be declared as interface, not a type if you want to use extends syntax.

And it's still impossible to use extend with arbitrary types - for example, it does not work if Event is a type parameter without any constraints.

Answer from artem on Stack Overflow
🌐
TypeScript
typescriptlang.org › docs › handbook › 2 › objects.html
TypeScript: Documentation - Object Types
For example, we might have a BasicAddress type that describes the fields necessary for sending letters and packages in the U.S. ... In some situations that’s enough, but addresses often have a unit number associated with them if the building at an address has multiple units. We can then describe an AddressWithUnit. ... This does the job, but the downside here is that we had to repeat all the other fields from BasicAddress when our changes were purely additive. Instead, we can extend the original BasicAddress type and just add the new fields that are unique to AddressWithUnit.
🌐
Medium
medium.com › @umefy › advanced-typescript-extending-different-types-and-overriding-properties-cc6c6d8d847b
Advanced TypeScript: Extending Different Types and Overriding Properties | by Umefy | Medium
January 4, 2024 - TypeScript allows for the extension of types using various methods, including intersection types and utility types. This is particularly useful when dealing with complex data structures or when integrating different modules.
🌐
smnh
smnh.me › extending-typescript-interfaces-and-type-aliases-with-common-properties
Extending TypeScript Interfaces and Type Aliases with common properties - smnh
December 21, 2022 - How TypeScript extends Interfaces and intersects Type Aliases that have common properties of different types.
🌐
Zod
zod.dev › api
Defining schemas | Zod
Zod provides an API for making some or all properties required, inspired by TypeScript's Required utility type.
🌐
DhiWise
dhiwise.com › post › typescript-extends-multiple-classes-a-deep-dive
A Deep Dive into TypeScript Extends Multiple Classes
April 22, 2024 - TypeScript provides powerful ways to combine types, either through intersection or union types. This feature is incredibly beneficial in class composition, allowing you to create complex types that can accept more than one defined type.
🌐
Medium
medium.com › @AlexanderObregon › what-happens-when-you-extend-interfaces-in-typescript-ad2cf0f43cfb
What Happens When You Extend Interfaces in TypeScript
July 18, 2025 - When you extend an interface in TypeScript, you’re not calling some function or adding inheritance logic like you would in a class. You’re telling the type system to combine structures. This happens entirely at compile time. The compiler takes one shape and blends in everything from another, creating a single set of expectations for how that final type should look.
Find elsewhere
🌐
Pluralsight
pluralsight.com › tech insights & how-to guides › software development
TypeScript Class: Extending Classes & Interfaces | Pluralsight
March 28, 2025 - To finish things up a new instance of the __ object is created and assigned to the derived type's prototype so it picks up prototype members from the base type. In the end, this little function provides a re-useable way to handle inheritance between two objects in JavaScript. If you're new to prototypes then you're probably appreciating the simplicity provided by the TypeScript extends keyword!
🌐
TypeScript
typescriptlang.org › docs › handbook › 2 › everyday-types.html
TypeScript: Documentation - Everyday Types
Being concerned only with the structure and capabilities of types is why we call TypeScript a structurally typed type system. Type aliases and interfaces are very similar, and in many cases you can choose between them freely. Almost all features of an interface are available in type, the key distinction is that a type cannot be re-opened to add new properties vs an interface which is always extendable.
🌐
Scaler
scaler.com › home › topics › typescript › extending interfaces
Extending Interfaces - Scaler Topics
May 4, 2023 - However, in order to maintain consistency, it is best to stick to one or the other. The 'extends' keyword has been used to extend the types in typescript and also for creating the UserActivity interfaces that can extend the event type.
🌐
TypeScript Tutorial
typescripttutorial.net › home › typescript tutorial › how to extend interfaces in typescript
TypeScript Extend Interface
August 10, 2023 - In this example, the interface D extends the interfaces B and C. So D has all the methods of B and C interfaces, which are a(), b(), and c() methods. TypeScript allows an interface to extend a class. In this case, the interface inherits the properties and methods of the class.
🌐
GitConnected
levelup.gitconnected.com › using-typescript-extending-generic-types-2c18459934ea
Using TypeScript — Extending Generic Types | by John Au-Yeung | Level Up Coding
June 21, 2020 - class Collection<T extends { name: string }> { protected items: T[] = []; constructor(items: T[]) { this.items.push(...items); } add(items: T) { this.items.push(items); } remove(index: number) { this.items.splice(index, 1); } getItem(index: number): T { return this.items[index]; } }class SearchableCollection<T extends { name: string }> extends Collection<T> { find(name: string): T | undefined { return this.items.find(item => item.name === name); } } In the example above, we have the { name: string } type which T must match.
🌐
GeeksforGeeks
geeksforgeeks.org › typescript › how-to-extend-an-interface-from-a-class-in-typescript
How to Extend an Interface from a class in TypeScript ? - GeeksforGeeks
September 12, 2025 - A new class extends the base class and implements the interface, providing the actual method definition. Finally, we create an object and call the method. In TypeScript, a class can implement multiple interfaces.
🌐
TypeScript Book
gibbok.github.io › typescript-book › book › extending-types
Extending Types | TypeScript Book
TypeScript Book · Search · Cancel ... } interface B { b: string; } interface Y extends A, B { y: string; } The extends keyword works only on interfaces and classes, for types use an intersection: type A = { a: number; }; type B = { b: number; }; type C = A & B; It is possible ...
🌐
Jelani Harris
jelaniharris.com › blog › how-to-extend-types-in-typescript
How to extend types in Typescript | Jelani Harris
September 16, 2023 - type Animal = { name: string; ... PredatorAnimal = Animal & Creature; We can extend interfaces in Typescript by using the extends keyword....
🌐
Damir's Corner
damirscorner.com › blog › posts › 20200911-ExtendingTypescriptTypeDefinitions.html
Extending TypeScript Type Definitions | Damir's Corner
September 11, 2020 - A TypeScript type definition can be extended in a different type definition file by declaring a module matching the original location of the type definition (vue/types/vue matches the vue.d.ts file in the types folder of the vue NPM package).
🌐
Tektutorialshub
tektutorialshub.com › home › typescript › extend interface in typescript
Extend Interface in TypeScript - Tektutorialshub
March 15, 2023 - We extend Interface in TypeScript to include other interfaces. This creates new a interface consisting of definitions from other interfaces.
🌐
Convex
convex.dev › core concepts › object-oriented programming (oop) › extend interface
Extend Interface | TypeScript Guide by Convex
This guide covers practical extension ... day in real applications. To add new properties to an interface in TypeScript, use the extends keyword:...
🌐
Graphite
graphite.com › guides › extending-types-typescript
Extending types in TypeScript
Type extension is the process of taking an existing type and creating a new type that adds new properties, modifies existing ones, or both. This allows you to specialize a base type for use in different contexts.