У мене є загальний інтерфейс, як цей приклад, з обмеженням на один тип:
export interface IExample<T extends MyClass> {
getById(id: number): T;
}
Чи можна вказати кілька обмежень типу замість лише одного?
Відповіді:
Typescript не пропонує синтаксис для отримання множинного успадкування для загальних типів. Однак можна досягти подібної семантики, використовуючи типи Union та типи Intersection. У вашому випадку ви хочете перехрестя:
interface Example<T extends MyClass & OtherClass> {}
Для союзу обох типів:
interface Example<T extends MyClass | OtherClass> {}
<T extends MyInterfaceA & MyInterfaceB>
потрібно, щоб тип реалізував обидва інтерфейси.
extends A|B
is поширюється на A або B, як extends A & B
поширюється на обидва! так що, можливо , ви повинні вказати , як у відповіді ....
Для цього можна було б використати суперінтерфейс (який також відповідає на питання "чому ви дозволяєте інтерфейсу успадковуватись від класу").
interface ISuperInterface extends MyClass, OtherClass {
}
export interface IExample<T extends ISuperInterface> {
getById(id: number): T;
}
Посилання на коментар щодо інтерфейсу, що походить від класу ... що в назві?
Я знайшов це в розділі 3.5 специфікації 0.9.0:
Оголошення інтерфейсу вводять лише іменовані типи, тоді як оголошення класів вводять іменовані типи та функції конструктора, які створюють екземпляри реалізацій цих іменованих типів. Названі типи, запроваджені оголошеннями класів та інтерфейсів, мають лише незначні відмінності (класи не можуть оголошувати необов'язкові члени, а інтерфейси не можуть оголошувати приватні члени) і в більшості контекстів взаємозамінні. Зокрема, декларації класів лише з загальнодоступними членами вводять іменовані типи, які функціонують точно так само, як ті, що створені деклараціями інтерфейсу.