Проще всего ответить на вопрос, в чем разница между typeof A
, new () => A
и {new (): A}
. Последние два эквивалентны, синтаксис { new() : A }
является более подробным двоюродным братом new () => A
. Причиной использования прежней более подробной версии является то, что она позволяет вам указывать больше перегрузок для конструктора, а также позволяет указывать дополнительные члены (то есть статические методы). typeof A
- это класс A
, который включает сигнатуру конструктора, а также любую статику. Если вы просто хотите создавать экземпляры класса, простая сигнатура конструктора достаточно хороша. Если вам нужен статический доступ, вам нужно typeof Class
.
Что касается другой вашей проблемы, проблема в том, что машинописный текст обрабатывает конструктор абстрактного класса как бит конструктора второго класса. Это не конструктор, кроме как внутри производного класса, который, поскольку класс не должен создаваться, не является плохой идеей. В этом случае, однако, это означает, что при вызове static
для A
класс A
не будет выполнять ограничение на наличие вызываемого конструктора (this: new () => T
)
Самое простое решение, которое я нашел, - создать интерфейс, расширяющий typeof A
. Это фактически стерет абстрактность конструктора и позволит вам создать нужный массив:
type AClass = (typeof A);
interface DerivedAClass extends AClass {}
let types : DerivedAClass[] = [B, C];
types
.map(t => t.staticF()) // T of staticF will be DerivedAClass
.forEach(x => console.log(x))
ссылка на игровую площадку