Soru TypeScript Generics için Çoklu Tip Kısıtlamaları Belirtebilirsiniz


Tek bir kısıtlama ile bu örnek gibi genel bir arabirim var:

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

Sadece bir tanesinin yerine çoklu tip kısıtlamaları belirtmek mümkün mü?


39
2018-06-15 16:40


Menşei




Cevaplar:


Sendika tiplerini destekleyen yazılarda

interface Example<T extends MyClass | OtherClass> {

}

37
2017-08-11 08:47



Birlik türleri, kısıtlamanın tek amacı için bir arabirim oluşturmanız gerekmediğinden bunu başarmanın harika bir yoludur. 2013'te geri gelmediler - ama bu kesinlikle bunu nasıl yapacağımı kesinlikle tavsiye ederim. - user75525
Bu cevap yanlış. Sendika türleri, iki farklı türün genişletilmesiyle aynı anlamlara sahip değildir. - AlexG
@AlexG Elbette bu aynı değil uzatma iki tür ama aynı uygulanması iki arayüz. - STO
Bunu şu şekilde değiştirmelisiniz T extends MyClass | OtherClass Bu işi yapmak için. Her şeyin yanında, T'nin hem tek bir kısıtlama hem de MyClass ve OtherClass olması beklenir. - Joe Lapp
Ayrıca, Typescript'in kesişim türlerini de desteklediğini unutmayın. Yani <T extends MyInterfaceA & MyInterfaceB> türün her iki arabirimi de uygulamasını gerektirir. - Tyler Cloutier


Bunun için bir çalışma süper bir arayüz kullanmak olacaktır (bu da "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;
}

25
2018-06-15 16:43



Bu doğru çözümdür. İki sınıftan bir arabirimi genişletmek biraz korkutucu olsa da, her ikisi de özel üyeleri bildirirse, arabirim çözülemez olur - Ryan Cavanaugh


Bir sınıftan türeyen bir arayüzle ilgili yorumu tekrar gözden geçirin ... bir isimde neyin var?

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

Arayüz beyanları sadece adlandırılmış türleri tanıtıyor, ancak sınıf   bildirimler, adlandırılmış türleri ve yapıcı işlevleri tanıtmak   adlandırılmış türlerin uygulama örneklerini oluşturmak. Adlandırılmış   sınıf ve arayüz bildirimleriyle tanıtılan türler sadece küçüktür   farklılıklar (sınıflar isteğe bağlı üyeleri ve arabirimleri bildiremez   özel üyeleri beyan edemez) ve çoğu bağlamda   Değiştirilebilir. Özellikle, sadece halka açık sınıf beyanları   üyeler tam olarak oluşturulanlar gibi işlev gören adlandırılmış türlerini tanıtıyor   arayüz bildirimleri ile.


1
2018-06-15 20:12



İsteğe bağlı sınıf üyeleri şu anda uygulanmaktadır: github.com/Microsoft/TypeScript/pull/8625 - Stefan Rein