網站搜尋

如何在 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];
}