Czy można rozszerzyć typy w Typescript?


155

Powiedzmy, że mam następujący typ:

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

Chcę teraz rozszerzyć ten typ, tj

type UserEvent extends Event = {
   UserId: string; 
}

To nie działa. W jaki sposób mogę to zrobić?


3
Słowo typekluczowe służy do definiowania aliasów typów , a nie interfejsów lub klas.
Heretic Monkey

Odpowiedzi:


283

Słowa kluczowego extendsmożna używać tylko w przypadku interfejsów i klas.

Jeśli chcesz tylko zadeklarować typ, który ma dodatkowe właściwości, możesz użyć typu przecięcia :

type UserEvent = Event & {UserId: string}

UPDATE dla TypeScript 2.2, można teraz mieć interfejs, który rozszerza typ obiektowy , jeśli typ spełnia pewne ograniczenia:

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

interface UserEvent extends Event {
   UserId: string; 
}

To nie działa w drugą stronę - UserEventmusi być zadeklarowane jako interfejs, a nie jako, typejeśli chcesz używać extendsskładni.

Nadal nie można go używać extend z dowolnymi typami - na przykład nie działa, jeśli Eventjest to parametr typu bez żadnych ograniczeń.


Używam TS 3.5.2 i nie mogę mieć interfejsu rozszerzającego typ. interface A<T> extends B<T> {blar}Interfejs może tylko rozszerzać typ obiektu lub przecinanie typów obiektów ze znanymi statycznie elementami
WORMSS

@WORMSS robi to, interface Identifiable<T> extends T { id: string }powodując błąd „Interfejs może tylko rozszerzyć typ obiektu lub część
wspólną

22

możesz przecinać typy:

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

gdzieś w swoim kodzie możesz teraz zrobić:

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

6

To, co próbujesz osiągnąć, jest równoważne

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

interface UserEvent extends Event {
   UserId: string; 
}

Sposób, w jaki zdefiniowałeś typy, nie pozwala na określenie dziedziczenia, jednak możesz osiągnąć coś podobnego za pomocą typów przecięcia, jak wskazał Artem .


8
Tak, ale nie podoba mi się to słowo, interfacekiedy mam na myślitype
Kousha,


-1

Może być poniższe podejście będzie pomocne dla kogoś TS z reakcjami

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

interface UserEvent<T> extends Event<T> {
    UserId: string;
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.