Your code will not do this because you want the static method not to be an instance method.
You can do it:
class Vehicle {
public static getNewInstance(): Vehicle {
return new this();
}
public getWheels(): Number {
throw new Error("unknown number of wheels for abstract Vehicle");
}
}
class Car extends Vehicle {
public getWheels(): Number {
return 4;
}
}
Since it Vehiclenow has a static method getNewInstance, then all extending classes also have.
So:
let v = Vehicle.getNewInstance();
console.log(v);
console.log(v.getWheels());
let c = Car.getNewInstance();
console.log(c);
console.log(c.getWheels());
Edit
, getNewInstance , :
abstract class Vehicle {
public abstract getNewInstance(): Vehicle;
}
class Car extends Vehicle {
public getNewInstance(): Vehicle {
return new Car();
}
public getWheels(): Number {
return 4;
}
}
:
class Vehicle {
private ctor: { new (): Vehicle };
constructor(ctor: { new (): Vehicle }) {
this.ctor = ctor;
}
public getNewInstance(): Vehicle {
return new this.ctor();
}
}
class Car extends Vehicle {
constructor() {
super(Car);
}
public getWheels(): Number {
return 4;
}
}