2016-01-14 89 views
1

我想知道是否有一種重載打字稿中的對象的函數屬性的簡單方法。例如:是否有可能在typescript中重載對象函數屬性?

interface Doable { 
    do(s: number): number; 
    do(s: string): string; 
} 

let obj: Doable = { 
    do(s: number): number; 
    do(s: string): string; 
    do(s: number | string) { 
     return s; 
    } 
} 

編譯器在這裏會產生一個錯誤,抱怨do屬性是重複的。沒有使用any是否有另一種聲明函數的方法?

我已經知道這個實現將起作用。

let obj: Doable = { 
    do(s: any) { 
     return s; 
    } 
} 

回答

0

您不需要在對象字面量中聲明重載簽名。只要寫:

interface Doable { 
    do(s: number): number; 
    do(s: string): string; 
} 

let obj: Doable = { 
    do(s: number | string): any { 
     return 42; 
     return ''; 
    } 
} 

obj(42); obj(''); // OK 

這樣做的返回值檢查部分是一個有點古怪,因爲技術上的打字稿希望你返回number & string這是不是實際發生的事情,所以使用any作爲返回類型是最簡單的方法去。

+0

感謝您的詳細解釋:) – eAbi

+0

這對於具有不同參數數量的過載是不正確的。也真正的重載返回正確的類型取決於哪個簽名匹配,而不是任何哪種丟失所有類型的安全 –

+0

我站在更正,雖然你的例子沒有顯示它,這對於不同數量的參數完全適用,並且任何isn在使用物體時不顯示。我的假設很糟糕,我讀得太快,並認爲你只是提出了原始聯盟類型。 –

1

如果您需要在不依賴接口的情況下執行此操作,則可以通過在對象字面量的範圍內重載函數並將其設置在文字上來實現此目的。

例如:

function myFunc(a : number) : number; 
function myFunc(b : string, c : string) : boolean; 
function myFunc(a : number | string, c? : string) : any{ 
    //function impl goes here 
} 

const myLiteral = { 
    myFunc 
}; 

這樣你就不必使用任何,你可以使用函數具有不同的參數數目。 (函數定義在我的例子退回任何未使用的有效函數簽名之一; IMPL是之前只有前兩個定義。)

從計上心來:https://www.typescriptlang.org/docs/handbook/functions.html(滾動至底部)

相關問題