Рассмотрим следующий фрагмент Typescript:
class Animal {
constructor(name: string) {
this.name = name;
}
name: string;
haveBaby(name: string): ?? return type ?? {
return new this.constructor(name); // Error
}
}
class Cat extends Animal {}
class Dog extends Animal {}
class Gerbil extends Animal {} // etc.
let sorachi = new Cat("Sorachi"); // a: Cat
let sorachiJr = a.haveBaby("Sorachi Jr."); // I want: sorachiJr: Cat
Животные могут иметь детей, и ребенок должен быть того же вида, что и родитель, т.е. должен быть экземпляром того же класса, что и родитель,Как назначить типы в этой ситуации, чтобы Typescript знал, что sorachiJr: Cat
?
Приведенный выше фрагмент кода не работает. Строка return new this.constructor(name)
выдает ошибку [ts] Cannot use 'new' with an expression whose type lacks a call or construct signature.
в кодексе VS.Единственное решение, которое я смог найти и понять, - это заменить this.constructor(name)
на (<any>this.constructor)(name)
или (<any>this).constructor(name)
, но тогда для sorachiJr
будет выведен тип any
, а не Cat
.Я попытался привести к typeof this
, а не any
, но получил ошибку [ts] Cannot find name 'this'
.
Как мне убедить Typescript в том, что рождение детей - это операция по сохранению вида?