I would like to extend a class and make it's dynamic type collapse into specific type (from T to Person).
I have created dummy classes for this example:
class Person {
constructor(public name: string){}
}
class Base<T> {
reference?: T
name: string
constructor(name: string) {
// Assign properties from T to this
this.name = name
}
static fromObject<T extends { name: string }>(object: T){
const base = new Base(object.name)
base.reference = object
return base
}
}
class Master<T> extends Base<T> {
static fromBase<T>(base: Base<T>){
const master = new Master(base.name)
master.reference = base.reference
return master
}
static fromObject<T extends { name: string }>(object: T){
return Master.fromBase(Base.fromObject(object))
}
}
class PersonMaster extends Master<Person> {
constructor(person: Person){
super(person.name)
this.reference = person
}
static fromBase(base: Base<Person>){
return new PersonMaster(base)
}
}
The compiler returns this error:
Class static side typeof PersonMaster incorrectly extends base class static side typeof Master. Types of property fromBase are incompatible. Type (base: Base<Person>) => PersonMaster is not assignable to type <T>(base: Base<T>) => Master<{}>. Types of parameters base and base are incompatible. Type Base<T> is not assignable to Base<Person>. Type T is not assignable to type Person.