網站搜尋

我可以在類別方法使用胖箭頭語法時使用 TypeScript 重載嗎?


我已將一些課程從傳統形式轉換過來:

class TestOverloads {
    private status = "blah";
    public doStuff(selector: JQuery);
    public doStuff(selector: string);
    public doStuff(selector: any) {
        alert(this.status);
    }
}

改用箭頭函數表達式:

class TestOverloads2 {
    private status = "blah";
    public doStuff = (selector: any) => {
        alert(this.status);
    }
}

以避免在回呼中使用類別方法時出現作用域問題(背景請見此處)。

不過我無法弄清楚如何重新建立我過載的函數簽名。在使用胖箭頭時,我該如何撰寫我的重載?

答案#1

您可以為函數支持的呼叫簽名編寫內聯類型文字:

class TestOverloads2 {
    private status = "blah";
    public doStuff: {
        (selector: JQuery): void;
        (selector: string): void;
    } = (selector: any) => {
        alert(this.status);
    }
}

那有點醜,所以你可能想把它提取到一個介面中:

interface SelectByJQueryOrString {
    (selector: JQuery): void;
    (selector: string): void;
}

class TestOverloads3 {
    private status = "blah";
    public doStuff: SelectByJQueryOrString = (selector: any) => {
        alert(this.status);
    }
}

答案#2

這有點技術上的細節,但你不再是在創建一個函數,而是在創建一個屬性(它碰巧是一個函數)。

你可以透過命名而不是重載來解決你的問題。

class TestOverloads2 {
    private status = "blah";
    public doStuffWithSelector = (selector: string) => {
        alert(this.status);
    }
    public doStuffWithJqueryObject = (jqo: JQuery) => {
        alert(this.status);
    }
}

如果有大量重複,你可以將其放在一個共同的函數中,然後兩個命名函數都調用它,例如:this.sharedStuff()。