¿Es posible extender tipos en Typecript?

156

Digamos que tengo el siguiente tipo:

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

Ahora quiero extender este tipo, es decir

type UserEvent extends Event = {
   UserId: string; 
}

Esto no funciona ¿Cómo puedo hacer esto?

Kousha
fuente
3
La typepalabra clave se utiliza para definir alias de tipo , no interfaces o clases.
Heretic Monkey

Respuestas:

285

La palabra clave extendsse puede usar solo para interfaces y clases.

Si solo desea declarar un tipo que tiene propiedades adicionales, puede usar el tipo de intersección :

type UserEvent = Event & {UserId: string}

ACTUALIZACIÓN para TypeScript 2.2, ahora es posible tener una interfaz que amplíe el tipo de objeto , si el tipo cumple algunas restricciones:

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

interface UserEvent extends Event {
   UserId: string; 
}

No funciona al revés: UserEventdebe declararse como interfaz, no typesi desea utilizar la extendssintaxis.

Y todavía es imposible de usar extend con tipos arbitrarios ; por ejemplo, no funciona si Eventes un parámetro de tipo sin restricciones.

artem
fuente
Estoy usando TS v3.5.2, y no puedo hacer que una interfaz extienda un tipo. interface A<T> extends B<T> {blar}Una interfaz solo puede extender un tipo de objeto o una intersección de tipos de objeto con miembros conocidos estáticamente
WORMSS
@WORMSS al hacer esto interface Identifiable<T> extends T { id: string }me da el error "Una interfaz solo puede extender un tipo de objeto o una intersección de tipos de objeto con miembros conocidos estáticamente
T
22

puedes intersecar tipos:

type TypeA = {
    nameA: string;
};
type TypeB = {
    nameB: string;
};
export type TypeC = TypeA & TypeB;

en algún lugar de tu código ahora puedes hacer:

const some: TypeC = {
    nameB: 'B',
    nameA: 'A',
};
Stanislav
fuente
6

Lo que estás tratando de lograr es equivalente a

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

interface UserEvent extends Event {
   UserId: string; 
}

La forma en que definió los tipos no permite especificar la herencia, sin embargo, puede lograr algo similar usando los tipos de intersección, como señaló Artem .

olydis
fuente
8
Sí, pero no me gusta la palabra interfacecuando realmente me refiero a untype
Kousha
Bastante justo, entonces la respuesta de artem debería ser
adecuada
-1

Puede estar por debajo del enfoque será útil para alguien TS con reactjs

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

interface UserEvent<T> extends Event<T> {
    UserId: string;
}
Jaison
fuente