2014-09-10 66 views
1

在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' 
    } 
} 

我的問題是:我會正確地解釋過載機構,所以提供的是一個返回值的簽名不是必需的,或者這一個錯誤?

+0

至少在呼叫方檢查過嗎? (如果你打電話給第一個超載,當你把結果看作是數字以外的東西時它會發出cro)聲) – Thilo 2014-09-10 10:14:51

+0

當pickcard被調用'15'(字符串)而不是15(數字)時,它會發出抱怨。如果'返回pickCard'改爲'return'someString''它不會抱怨。 – donnut 2014-09-10 10:26:04

+0

不,我的意思是,根據選擇正確的過載,來電方是否得到適當的返回值類型推斷?根據@史蒂芬芬頓的回答,它的確如此。所以你在這裏有一些價值,即使它沒有完全檢查函數的實現,它也檢查調用代碼。 – Thilo 2014-09-10 11:01:31

回答

1

當我打電話給你的功能,我得到以下類型的返回:

// a is number 
var a = pickCard([{ suit: 'hearts', card: 1 }]); 

// b is {suit: string; card: number; } 
var b = pickCard(1); 

這節省了我不必手動指定:

// a is number 
var a: number = pickCard([{ suit: 'hearts', card: 1 }]); 

// b is {suit: string; card: number; } 
var b: {suit: string; card: number; } = pickCard(1); 

如果你讓他們「錯誤你會確實會得到有關類型的錯誤:

// a is number 
var a: {suit: string; card: number; } = pickCard([{ suit: 'hearts', card: 1 }]); 

// b is {suit: string; card: number; } 
var b: number = pickCard(1); 

所以超載確實是pi根據您傳遞的參數加載 - 並根據所選的過載調整返回類型。

View this example on the TypeScript Playground

+0

如果pickCard沒有返回一個數字而是一個字符串(例如,由於編程錯誤),Typescript不會抱怨。 (例如https://gist.github.com/donnut/7a99207254d23de08ecb)。 'a'將是'notANumber'而不是2。 – donnut 2014-09-10 10:51:01

+0

@donut。但是這將是該函數實現中的編程錯誤。你確實需要對調用該函數的代碼進行類型檢查。至少是這樣。 – Thilo 2014-09-10 10:59:24

+0

你說得對。對於我來說忘記了Typescript會進行編譯時類型檢查而不是運行時。如果像這樣編程錯誤也會被捕獲,那將會很好。 – donnut 2014-09-10 11:25:34