Абстрактный тип конструктора в TypeScript

Подпись типа для не-абстрактного класса (неабстрактная конструкторская функция) в TypeScript заключается в следующем:

declare type ConstructorFunction = new (...args: any[]) => any;

Это также называется новым типом. Однако мне нужна сигнатура типа для абстрактного класса (функция абстрактного конструктора). Я понимаю, что он может быть определен как имеющий тип Function, но это слишком широко. Разве нет более точной альтернативы?


Edit:

Чтобы уточнить, что я имею в виду, следующий небольшой фрагмент демонстрирует разницу между абстрактным конструктором и неабстрактным конструктором:

declare type ConstructorFunction = new (...args: any[]) => any;

abstract class Utilities {
    ...
}

var UtilityClass: ConstructorFunction = Utilities; // Error.

Тип 'typeof Utilities' не присваивается типу 'new (... args: any []) = > any'.

Невозможно присвоить тип абстрактного конструктора неструктурированному типу конструктора.

Ответ 1

Я просто боролся с подобной проблемой, и это, похоже, работает для меня:

type Constructor<T> = Function & { prototype: T }

Ответ 2

С той же проблемой. Я предполагаю, что суть абстрактной конструкции конструктора является отсутствием в объявлении new ( ... ) : X thingy. Вот почему это можно явно объявить.

Однако. Вы можете сделать это, и он скомпилируется.

var UtilityClass: typeof Utilities  = Utilities;

typeof Something - отличный способ ссылаться на типы конструкторов, однако его нельзя продлить.

И в любом случае вы можете сделать следующее:

var UtilityClass: ConstructorFunction = <any> Utilities;

Ответ 3

Весь смысл абстрактных классов (в OO в целом) заключается в том, что вы не можете их создавать, вам нужна конкретная не абстрактная реализация.

Я предполагаю, что вы хотите иметь разные реализации этого абстрактного класса и хотите иметь возможность получать одну из этих реализаций (как параметр или что-то подобное).
Если это произойдет, возможно, это может решить вашу проблему:

declare type ConstructorFunction<T extends Utilities> = new (...args: any[]) => T;

abstract class Utilities { }

class MyUtilities extends Utilities { }

var UtilityClass: ConstructorFunction<MyUtilities> = MyUtilities;