Ответ 1
Я просто боролся с подобной проблемой, и это, похоже, работает для меня:
type Constructor<T> = Function & { prototype: T }
Подпись типа для не-абстрактного класса (неабстрактная конструкторская функция) в 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'.
Невозможно присвоить тип абстрактного конструктора неструктурированному типу конструктора.
Я просто боролся с подобной проблемой, и это, похоже, работает для меня:
type Constructor<T> = Function & { prototype: T }
С той же проблемой. Я предполагаю, что суть абстрактной конструкции конструктора является отсутствием в объявлении new ( ... ) : X
thingy. Вот почему это можно явно объявить.
Однако. Вы можете сделать это, и он скомпилируется.
var UtilityClass: typeof Utilities = Utilities;
typeof Something
- отличный способ ссылаться на типы конструкторов, однако его нельзя продлить.
И в любом случае вы можете сделать следующее:
var UtilityClass: ConstructorFunction = <any> Utilities;
Весь смысл абстрактных классов (в OO в целом) заключается в том, что вы не можете их создавать, вам нужна конкретная не абстрактная реализация.
Я предполагаю, что вы хотите иметь разные реализации этого абстрактного класса и хотите иметь возможность получать одну из этих реализаций (как параметр или что-то подобное).
Если это произойдет, возможно, это может решить вашу проблему:
declare type ConstructorFunction<T extends Utilities> = new (...args: any[]) => T;
abstract class Utilities { }
class MyUtilities extends Utilities { }
var UtilityClass: ConstructorFunction<MyUtilities> = MyUtilities;