2013-12-17 50 views
10

我已經轉換了一些類從常規形式:對類方法使用胖箭頭語法時可以使用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); 
    } 
} 

以便避免範圍設定問題,當在回調使用的類的方法(背景見here)。

雖然我不能解決如何重新創建我的重載函數簽名。如何在使用胖箭頭時編寫我的重載?

+0

待辦事項不使用胖箭頭的方法。它將成爲這個類的一個屬性,而不是一個原型方法。 – garkin

回答

15

你可以寫一個內嵌式的文字呼叫簽名功能支持:

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); 
    } 
} 
+0

接口類型註釋是一個好主意。 – Fenton

+0

不錯,謝謝瑞恩! –

+0

注意:在學習這個時,我遇到了這個TS Dos和Donts:https://www.typescriptlang.org/docs/handbook/declaration-files/do-s-and-don-ts.html在底部在使用聯合類型部分的頁面中,它提到使用聯合進行單一位置重載。因此,在這個例子中,它定義爲'selector:JQuery | string):void'。我想知道,實際情況是否應該是工會而不是「任何」? - '... =(selector:JQuery | string)=> {alert ...' – ibgib

3

這是一個技術問題,但你不再創建一個函數,你正在創建一個屬性(這恰好是一個函數)。

雖然您可以使用命名而不是重載來解決您的問題。

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

如果有顯著重複,你可以把一個普通函數,該函數命名函數調用,例如:this.sharedStuff()

相關問題