Possible to Extend Types in Typescript?
Say I Have the Following Type: Type Event = { Name: String; dateCreated: String; Type: String; } I Now Want to Extend This Type, I. E. Type Userevent Extends...
Say I have the following type:
type Event = {
name: string;
dateCreated: string;
type: string;
}
I now want to extend this type, i.e.
type UserEvent extends Event = {
UserId: string;
}
This doesn't work. How can I do this?
4 Answers
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.
you can intersect types:
type TypeA = {
nameA: string;
};
type TypeB = {
nameB: string;
};
export type TypeC = TypeA & TypeB;
somewhere in you code you can now do:
const some: TypeC = {
nameB: 'B',
nameA: 'A',
};
What you are trying to achieve is equivalent to
interface Event {
name: string;
dateCreated: string;
type: string;
}
interface UserEvent extends Event {
UserId: string;
}
The way you defined the types does not allow for specifying inheritance, however you can achieve something similar using intersection types, as artem pointed out.
A generic extension type can be written as follows:
type Extension<T> = T & { someExtensionProperty: string }