Mam ogólny interfejs, taki jak ten przykład z jednym ograniczeniem typu:
export interface IExample<T extends MyClass> {
getById(id: number): T;
}
Czy można określić wiele ograniczeń typu zamiast tylko jednego?
Odpowiedzi:
Typescript nie oferuje składni umożliwiającej wielokrotne dziedziczenie dla typów ogólnych. Możesz jednak osiągnąć podobną semantykę, używając typów Union i Intersection. W twoim przypadku chcesz skrzyżowania:
interface Example<T extends MyClass & OtherClass> {}
Dla związku obu typów:
interface Example<T extends MyClass | OtherClass> {}
<T extends MyInterfaceA & MyInterfaceB>
wymaga, aby typ implementował oba interfejsy.
extends A|B
rozciąga się na A LUB B, a także na extends A & B
oba! więc może powinieneś określić oba w swojej odpowiedzi ...
Rozwiązaniem tego problemu byłoby użycie superinterfejsu (który również odpowiada na pytanie „dlaczego miałbyś pozwolić interfejsowi na dziedziczenie z klasy”).
interface ISuperInterface extends MyClass, OtherClass {
}
export interface IExample<T extends ISuperInterface> {
getById(id: number): T;
}
Odwołaj się do komentarza o interfejsie pochodzącym z klasy ... co jest w nazwie?
Znalazłem to w sekcji 3.5 specyfikacji 0.9.0:
Deklaracje interfejsów wprowadzają tylko nazwane typy, podczas gdy deklaracje klas wprowadzają nazwane typy i funkcje konstruktora, które tworzą wystąpienia implementacji tych nazwanych typów. Nazwane typy wprowadzone przez deklaracje klas i interfejsów mają tylko niewielkie różnice (klasy nie mogą deklarować opcjonalnych elementów członkowskich, a interfejsy nie mogą deklarować prywatnych elementów członkowskich) i są w większości kontekstów wymienne. W szczególności deklaracje klas zawierające tylko publiczne elementy członkowskie wprowadzają nazwane typy, które działają dokładnie tak samo, jak te utworzone przez deklaracje interfejsu.