前兩個都只是簽名,指定哪些不同的選項調用功能。
第三個是實際的函數定義,它只接收一個參數並返回任何參數。
在其中實現了實際的邏輯,檢查函數收到的類型,並根據傳遞的參數返回適當的值。
例如:
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;
}
}
[This answer](http://stackoverflow.com/a/35552201/2788872)可能與您的問題有關。 –