Я думаю, вам следует изменить аннотацию на следующую:
function foo(subclass: new () => A) {
const obj = new subclass();
}
Здесь мы говорим, что subclass
new
способен (то есть это функция конструктора Вы вызываете с оператором new
), не принимает аргументов и создает значение, тип которого можно присвоить A
. Это должно принять любой конкретный подкласс A
, если он имеет конструктор без аргументов:
foo(B); // okay
foo(C); // okay
Он не будет принимать A
сам, потому что абстрактный конструктор класса не считается new
able:
foo(A); // error, A is abstract
О, как примечание для людей, делающих пример кода TypeScript для вопросов переполнения стека: Обратите внимание, что система типов TypeScript структурная . В приведенных вами примерах определений экземпляры A
, B
и C
считаются одинаковыми, пустой . И все объекты присваиваются пустому типу , поэтому это также работает:
foo(Date); // okay also
Чтобы предотвратить это, вы должны добавить свойства в A
, B
и / или C
различать guish их структурно, например:
abstract class A {
a = "A"
};
class B extends A {
b = "B"
};
class C extends A {
c = "C"
};
, что приведет к более ожидаемому поведению:
foo(B); // okay
foo(C); // okay
foo(A); // error, A is abstract
foo(Date); // error, 'a' is missing
Хорошо, надеюсь, что помогает; удачи!
Детская площадка ссылка на код