在Typescript中重載函數具有意想不到的行爲。是函數重載中的返回類型簽名沒用嗎?
看看函數重載example,返回值簽名是函數重載的一部分。但是,返回類型似乎完全被忽略。 Typescript沒有必要「挑選」正確的函數參數簽名,而最讓我困擾的是,它不用於檢查正確的返回值。
如果卡的返回值從數字更改爲字符串,Typescript不會給出任何警告。
function pickCard(x: {suit: string; card: number; }[]): number;
function pickCard(x: number): {suit: string; card: number; };
function pickCard(x): any {
// Check to see if we're working with an object/array
// if so, they gave us the deck and we'll pick the card
if (typeof x == "object") {
var pickedCard = Math.floor(Math.random() * x.length);
return pickedCard;
}
// Otherwise just let them pick the card
else if (typeof x == "number") {
var pickedSuit = Math.floor(x/13);
return { suit: suits[pickedSuit], card: x % 13 }; // <-- change to card: '13'
}
}
我的問題是:我會正確地解釋過載機構,所以提供的是一個返回值的簽名不是必需的,或者這一個錯誤?
至少在呼叫方檢查過嗎? (如果你打電話給第一個超載,當你把結果看作是數字以外的東西時它會發出cro)聲) – Thilo 2014-09-10 10:14:51
當pickcard被調用'15'(字符串)而不是15(數字)時,它會發出抱怨。如果'返回pickCard'改爲'return'someString''它不會抱怨。 – donnut 2014-09-10 10:26:04
不,我的意思是,根據選擇正確的過載,來電方是否得到適當的返回值類型推斷?根據@史蒂芬芬頓的回答,它的確如此。所以你在這裏有一些價值,即使它沒有完全檢查函數的實現,它也檢查調用代碼。 – Thilo 2014-09-10 11:01:31