我可以在類別方法使用胖箭頭語法時使用 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()。
