Typcript'te türleri genişletmek mümkün mü?


156

Aşağıdaki tipe sahip olduğumu söyle:

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

Şimdi bu türü genişletmek istiyorum, yani

type UserEvent extends Event = {
   UserId: string; 
}

Bu işe yaramıyor. Bunu nasıl yapabilirim?


3
typeAnahtar kelime tanımlamak için kullanılır tipi takma adlarını , değil arabirimleri veya sınıfları.
Heretic Maymun

Yanıtlar:


285

Anahtar kelime extendsyalnızca arayüzler ve sınıflar için kullanılabilir.

Yalnızca ek özelliklere sahip bir tür bildirmek istiyorsanız, kavşak türünü kullanabilirsiniz :

type UserEvent = Event & {UserId: string}

TypeScript 2.2 için GÜNCELLEME , artık tür bazı kısıtlamaları karşılıyorsa, nesne benzeri türü genişleten bir arabirime sahip olmak mümkündür :

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

interface UserEvent extends Event {
   UserId: string; 
}

Diğer yönde çalışmaz - sözdizimi kullanmak istiyorsanız UserEventbir arayüz olarak değil, arayüz olarak bildirilmelidir .typeextends

Ve extend rastgele türlerle kullanmak hala imkansız - örneğin, Eventherhangi bir kısıtlama olmadan bir tür parametresi ise işe yaramaz .


TS v3.5.2 kullanıyorum ve bir arabirimi bir tür genişletmek mümkün değil. interface A<T> extends B<T> {blar}Bir arabirim yalnızca statik olarak bilinen üyelerle bir nesne türünü veya nesne türlerinin kesişimini uzatabilir
WORMSS

@WORMSS bunu interface Identifiable<T> extends T { id: string }bana hata veriyor "Bir arabirim yalnızca bir nesne türünü veya statik olarak bilinen
üyelerle

22

türleri kesiştirebilirsiniz:

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

Kodunuzda bir yerde artık şunları yapabilirsiniz:

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

6

Ulaşmaya çalıştığınız şey şuna eşdeğerdir:

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

interface UserEvent extends Event {
   UserId: string; 
}

Türleri tanımlama şekliniz kalıtımın belirlenmesine izin vermez, ancak artem'in işaret ettiği gibi kavşak türlerini kullanarak benzer bir şey elde edebilirsiniz .


8
Evet, ama interfaceaslında bir şey demek istediğim kelimeyi sevmiyorumtype
Kousha

Yeterince adil, o zaman
artem'in

-1

Aşağıdaki yaklaşım olabilir tepki olan TS biri için yararlı olacaktır

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

interface UserEvent<T> extends Event<T> {
    UserId: string;
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.