轉載
TypeScript基礎入門 - 函數 - 重載
項目實踐倉庫
https://github.com/durban89/typescript_demo.git
tag: 1.2.5
為了保證后面的學習演示需要安裝下ts-node,這樣后面的每個操作都能直接運行看到輸出的結果。
npm install -D ts-node
后面自己在練習的時候可以這樣使用
npx ts-node 腳本路徑
函數
重載
JavaScript本身是個動態(tài)語言。 JavaScript里函數根據傳入不同的參數而返回不同類型的數據是很常見的棵譬。如下實例
let suits = ["hearts", "spades", "clubs", "diamonds"];
function pickCard(x: any): any {
if (typeof x == "object") {
let pickCard = Math.floor(Math.random() * x.length);
return pickCard;
} else if (typeof x == 'number') {
let pickedSuit = Math.floor(x / 13);
return {
suit: suits[pickedSuit],
card: x % 13,
}
}
}
let myDeck = [
{
suit: "diamands",
card: 2,
},
{
suit: 'spades',
card: 10,
},
{
suit: 'hearts',
card: 4
}
]
let pickedCard1 = myDeck[pickCard(myDeck)];
let pickedCard2 = pickCard(15);
console.log('card: ' + pickedCard1.card + ' of ' + pickedCard1.suit);
console.log('card: ' + pickedCard2.card + ' of ' + pickedCard2.suit);
運行后得到類型如下結果
$ npx ts-node src/function_7.ts
card: 2 of diamands
card: 2 of spades
pickCard方法根據傳入參數的不同會返回兩種不同的類型。 如果傳入的是代表紙牌的對象,函數作用是從中抓一張牌殴胧。 如果用戶想抓牌,我們告訴他抓到了什么牌佩迟。 但是這怎么在類型系統(tǒng)里表示呢团滥。方法是為同一個函數提供多個函數類型定義來進行函數重載。 編譯器會根據這個列表去處理函數的調用报强。 下面我們來重載 pickCard函數灸姊。
let suits = ["hearts", "spades", "clubs", "diamonds"];
function pickCard(x: {suit: string, card: number}[]): number;
function pickCard(x: number): {suit: string, card: number};
function pickCard(x: any): any {
if (typeof x == "object") {
let pickedCard = Math.floor(Math.random() * x.length);
return pickedCard;
} else if (typeof x == 'number') {
let pickedSuit = Math.floor(x / 13);
return {
suit: suits[pickedSuit],
card: x % 13,
}
}
}
let myDeck = [
{
suit: "diamands",
card: 2,
},
{
suit: 'spades',
card: 10,
},
{
suit: 'hearts',
card: 4
}
]
let pickedCard1 = myDeck[pickCard(myDeck)];
let pickedCard2 = pickCard(15);
console.log('card: ' + pickedCard1.card + ' of ' + pickedCard1.suit);
console.log('card: ' + pickedCard2.card + ' of ' + pickedCard2.suit);
得到的結果類似如下
$ npx ts-node src/function_7.ts
card: 10 of spades
card: 2 of spades
這樣改變后,重載的pickCard函數在調用的時候會進行正確的類型檢查秉溉。
為了讓編譯器能夠選擇正確的檢查類型力惯,它與JavaScript里的處理流程相似。 它查找重載列表召嘶,嘗試使用第一個重載定義父晶。 如果匹配的話就使用這個。 因此弄跌,在定義重載的時候甲喝,一定要把最精確的定義放在最前面。
注意铛只,function pickCard(x: any): any并不是重載列表的一部分埠胖,因此這里只有兩個重載:一個是接收對象另一個接收數字。 以其它參數調用 pickCard會產生錯誤格仲。
本實例結束實踐項目地址
https://github.com/durban89/typescript_demo.git
tag: 1.2.6