TypeScript Generics İçin Birden Çok Tür Kısıtlaması Belirtebilir misiniz?


83

Tek tür kısıtlaması olan bu örnek gibi genel bir arabirimim var:

export interface IExample<T extends MyClass> {
    getById(id: number): T;
}

Tek bir sınırlama yerine birden çok tür kısıtlaması belirlemek mümkün müdür?

Yanıtlar:


87

Typescript, genel türler için birden fazla miras almak için bir sözdizimi sunmaz. Ancak, Birleşim türlerini ve Kesişim türlerini kullanarak benzer anlamlar elde edebilirsiniz. Senin durumunda, bir kavşak istiyorsun:

interface Example<T extends MyClass & OtherClass> {}

Her iki türden bir Birlik için:

interface Example<T extends MyClass | OtherClass> {}

4
Birleşim türleri, yalnızca kısıtlama amacıyla bir arabirim oluşturmanız gerekmediğinden, bunu başarmanın harika bir yoludur. 2013'te varolmadılar - ama kesinlikle bunu şimdi yapmayı tavsiye ederim.
Fenton

5
Bu cevap yanlış. Birlik türleri, iki farklı türü genişletmekle aynı anlamlara sahip değildir.
AlexG

3
@AlexG Elbette bu, iki türü genişletmekle aynı şey değil, iki arabirimi uygulamakla aynı .
STO

6
Ayrıca Typescript'in kesişim türlerini de desteklediğini unutmayın. Bu nedenle <T extends MyInterfaceA & MyInterfaceB>, türün her iki arabirimi de uygulamasını gerektirir.
Tyler Cloutier

2
Anladığım kadarıyla, anlambilim extends A|BA OR B'yi extends A & Bgenişletir ve ikisini de kapsar! belki de cevabınızda ikisini de belirtmelisiniz ....
Pipo

34

Bunun için geçici bir çözüm, bir süper arabirim kullanmak olabilir (bu aynı zamanda "bir arabirimin bir sınıftan miras almasına neden izin verirsiniz" sorusunu da yanıtlar).

interface ISuperInterface extends MyClass, OtherClass {

}

export interface IExample<T extends ISuperInterface> {
    getById(id: number): T;
}

12
Bu doğru çözüm. Bir arayüzü iki sınıftan genişletmek biraz korkutucu olsa da - eğer ikisi de özel üye ilan ederse arayüz yerine getirilemez
Ryan Cavanaugh

1

Bir sınıftan türetilen bir arayüz hakkındaki yorumu ref ... bir isimde ne var?

Bunu 0.9.0 spesifikasyonunun 3.5 bölümünde buldum:

Arabirim bildirimleri yalnızca adlandırılmış türleri sunarken, sınıf bildirimleri bu adlandırılmış türlerin uygulamalarının örneklerini oluşturan adlandırılmış türleri ve yapıcı işlevleri sunar. Sınıf ve arabirim bildirimleri tarafından tanıtılan adlandırılmış türlerin yalnızca küçük farklılıkları vardır (sınıflar isteğe bağlı üyeleri bildiremez ve arabirimler özel üyeleri bildiremez) ve çoğu bağlamda birbirinin yerine kullanılabilir. Özellikle, yalnızca genel üyelere sahip sınıf bildirimleri, tam olarak arabirim bildirimleri tarafından oluşturulanlar gibi işlev gören adlandırılmış türleri sunar.


İsteğe bağlı sınıf üyeleri şimdi uygulandı: github.com/Microsoft/TypeScript/pull/8625
Stefan Rein
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.