У меня есть общий интерфейс, подобный этому примеру, с ограничением одного типа:
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
расширяет A OR B, как extends A & B
расширяет оба! так что, возможно, вам следует указать оба в своем ответе ....
Обойти это можно, используя супер-интерфейс (который также отвечает на вопрос «почему вы позволяете интерфейсу наследовать от класса»).
interface ISuperInterface extends MyClass, OtherClass {
}
export interface IExample<T extends ISuperInterface> {
getById(id: number): T;
}
Ссылка на комментарий об интерфейсе, производном от класса ... что в имени?
Я нашел это в разделе 3.5 спецификации 0.9.0:
Объявления интерфейсов представляют только именованные типы, тогда как объявления классов представляют именованные типы и функции-конструкторы, которые создают экземпляры реализаций этих именованных типов. Именованные типы, представленные объявлениями классов и интерфейсов, имеют лишь незначительные различия (классы не могут объявлять необязательные члены, а интерфейсы не могут объявлять частные члены) и в большинстве контекстов взаимозаменяемы. В частности, объявления классов только с общедоступными членами представляют именованные типы, которые работают точно так же, как созданные объявлениями интерфейсов.