如何在 Typescript 中定義一個類的陣列(不是實例)
我正在嘗試在 Typescript 中使用一些語言結構。我想建立一個類別的陣列,這些類別之後會被實例化。我目前的程式碼似乎能編譯,並且如果我在 Typescript Playground 上測試,它也能運作,但在 typescript 編輯器中會出現錯誤:Argument of type 'typeof Greeter' is not assignable to parameter of type 'BaseGreeter'.
我猜這是因為陣列定義預期的是擴展 BaseGreeter 的類的實例,而不是擴展它的類本身。這正確嗎?如果是這種情況,我要如何定義一個擴展 BaseGreeter 的類的陣列?
這是程式碼:
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);
答案#1
BaseGreeter 類型表示某個值符合 BaseGreeter 介面,並且是 BaseGreeter 類別的實例。指定 BaseGreeter 建構函數的類型是 typeof BaseGreeter:
function getGreeters(): [string, typeof BaseGreeter[]]{
let greeters = new Array<typeof BaseGreeter>();
greeters.push(Greeter);
greeters.push(Greeter2);
greeters.push(Greeter3);
return ["test", greeters];
}
