Мое предложение таково:
let classes: Array<new (...args: any) => Base<any>> = [];
classes.push(Derived); // okay
classes.push(SecondDerived); // okay
Тип элемента массива должен быть «конструктором любого подтипа Base<T>
для любого T
». Чтобы сказать «конструктор X
» как тип, вы используете new
подпись , например new () => X
. Обратите внимание, что подпись указывает, какие типы и числовые аргументы ожидает конструктор; если вам все равно, то вы можете использовать аргумент отдыха типа any
или any[]
, например new (...args: any) => X
.
Поскольку тип, который вы создаете, является любым подтип Base<T>
для любого T
, и вам, вероятно, не нужно отслеживать какой из них, тогда Base<any>
, вероятно, достаточно хорош. (Если нет, то, пожалуйста, опишите случай использования, для которого это не работает).
Хорошо, надеюсь, это поможет; удачи!
Детская площадка ссылка на код