Вы можете передать дочерний тип в родительский конструктор и сохранить ссылку. Это препятствует тому, чтобы родитель знал обо всех возможных типах дочерних элементов (хотя я согласен с другим ответом, что может быть лучший способ достичь вашей общей цели). Примерно так ( детская площадка ):
type ChildConstructor<Child> = new (value: number, childConstructor: ChildConstructor<Child>) => Child;
abstract class AbstractParent<Child extends AbstractParent<Child>> {
protected value: number;
protected childConstructor: ChildConstructor<Child>;
constructor(value: number, childConstructor: ChildConstructor<Child>) {
this.value = value;
this.childConstructor = childConstructor;
}
public times(multiplicator: number): Child {
return new this.childConstructor(this.value * multiplicator, this.childConstructor);
}
}
class Foo extends AbstractParent<Foo> {
constructor(value: number) {
super(value, Foo);
}
}
class Bar extends AbstractParent<Bar> {
constructor(value: number) {
super(value, Bar);
}
}
Обратите внимание, что для обеспечения 100% -ой безопасности типов у каждого дочернего класса должно быть хотя бы одно дополнительное частное свойство или метод для хранения TypeScript. «типизирование утки» из-за того, что классы считаются взаимозаменяемыми (поскольку они имеют одинаковые свойства и методы).