I am trying out some language constructs in Typescript. I am looking to make an array of classes, where the classes are later instantiated.
The code I have seems to compile and works if I try it on the Typescript Playground but it does give an error in the typescript box: Argument of type 'typeof Greeter' is not assignable to parameter of type 'BaseGreeter'.
I guess this is because the array definition expects instances of classes that extend BaseGreeter, not the classes themselves that extend it. Is that correct? If that is the case, how do I define an array of classes that extend BaseGreeter?
This is the code:
class BaseGreeter {
greeting: string;
greeting_start: string;
constructor(message: string) {
this.greeting = message;
}
greet() {
return this.greeting_start + ", " + this.greeting;
}
}
class Greeter extends BaseGreeter{
constructor(message: string) {
super(message);
this.greeting_start = "Hello";
}
}
class Greeter2 extends BaseGreeter {
constructor(message: string) {
super(message);
this.greeting_start = "Bye";
}
}
class Greeter3 extends BaseGreeter {
constructor(message: string) {
super(message);
this.greeting_start = "Adieu";
}
}
function getGreeters() :[string, BaseGreeter[]]{
let greeters = new Array<BaseGreeter>();
greeters.push(Greeter);
greeters.push(Greeter2);
greeters.push(Greeter3);
return ["test", greeters];
}
let foo = {};
let retval = getGreeters();
alert(retval[0]);
foo['greeters'] = retval[1];
var i = 0;
let button = document.createElement('button');
button.textContent = "Say Hello";
button.onclick = function () {
let greeter = new foo['greeters'][i]("cruel world");
alert(greeter.greet());
i = i + 1;
}
document.body.appendChild(button);
new Array<typeof BaseGreeter>(...)but using the array constructor is a terrible practice. You don't need to specify a type at all anyway, even if you do use the constructor, because it will be inferred from the elements. So: direct fix islet greeters = new Array<typeof BaseGreeter>();but that's bad code - writelet greeters = [Greeter1, Greeter2, Greeter3];Arrayas a function to specify the length but I can't remember the last time I needed to do that.