2016-04-20 62 views
1

以函數重載的這個例子:爲什麼我不能以這種方式調用重載函數?

function pickCard(x: {suit: string; card: number; }[]): number; 
function pickCard(x: number): {suit: string; card: number; }; 
function pickCard(x): any { 
     /* ... */ 
} 

Handbook它說:

注意,function pickCard(x): any片不是 過載列表的一部分,所以它只有兩個重載:一個這需要一個對象 和一個需要一個數字。使用任何其他參數 類型調用pickCard將導致錯誤。

因此我不能撥打pickCard("test");。它會引發錯誤。

如果pickCard(x)不是有效的函數簽名,那麼爲什麼我們必須寫它?有什麼好處呢?有沒有我沒有想到的用例?

退房的playground example

+0

[This answer](http://stackoverflow.com/a/35552201/2788872)可能與您的問題有關。 –

回答

2

前兩個都只是簽名,指定哪些不同的選項調用功能。

第三個是實際的函數定義,它只接收一個參數並返回任何參數。
在其中實現了實際的邏輯,檢查函數收到的類型,並根據傳遞的參數返回適當的值。

例如:

function a(str: string): string; 
function a(num: number): number; 
function a(value: any): any { 
    if (typeof value === "string") { 
     return (parseInt(value) * 2).toString(); 
    } else { 
     return value * 2; 
    } 
} 

a("3"); // should be "6" 
a(3); // should be 6 
a(true); // error 

你需要有第三個,因爲否則你就需要使用其他簽名作爲實際函數的定義之一。
如果你選擇第一個參數是一個字符串而不是數字,如果你使用第二個參數,那麼參數是一個數字而不是一個字符串。
這就是爲什麼第三個人在那裏,它會計算出傳入的實際參數,並基於該參數進行邏輯處理。

你也可以有不同數量的屬性:

function b(a: number): number; 
function b(a: number, b: number): number; 
function b(...args: number[]): any { 
    if (args.length == 1) { 
     ... 
    } else { 
     ... 
    } 
} 

這通常是在你使用不同的簽名,爲的Cuz相同數量的不同類型,你可以簡單地則params的情景:

function a(value: string | number): any { 
    if (typeof value === "string") { 
     return (parseInt(value) * 2).toString(); 
    } else { 
     return value * 2; 
    } 
} 
+0

非常感謝,併爲最後的獎金。 –

相關問題