TypeScript基礎入門 - 函數 - 重載

轉載

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
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末押袍,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子凯肋,更是在濱河造成了極大的恐慌谊惭,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件侮东,死亡現場離奇詭異圈盔,居然都是意外死亡,警方通過查閱死者的電腦和手機悄雅,發(fā)現死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進店門驱敲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人宽闲,你說我怎么就攤上這事众眨∥漳粒” “怎么了?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵娩梨,是天一觀的道長沿腰。 經常有香客問我,道長狈定,這世上最難降的妖魔是什么颂龙? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮纽什,結果婚禮上措嵌,老公的妹妹穿的比我還像新娘。我一直安慰自己芦缰,他們只是感情好企巢,可當我...
    茶點故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著饺藤,像睡著了一般包斑。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上涕俗,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天罗丰,我揣著相機與錄音,去河邊找鬼再姑。 笑死萌抵,一個胖子當著我的面吹牛,可吹牛的內容都是我干的元镀。 我是一名探鬼主播绍填,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼栖疑!你這毒婦竟也來了讨永?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤遇革,失蹤者是張志新(化名)和其女友劉穎卿闹,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體萝快,經...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡锻霎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了揪漩。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片旋恼。...
    茶點故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖奄容,靈堂內的尸體忽然破棺而出冰更,到底是詐尸還是另有隱情产徊,我是刑警寧澤,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布冬殃,位于F島的核電站囚痴,受9級特大地震影響,放射性物質發(fā)生泄漏审葬。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一奕谭、第九天 我趴在偏房一處隱蔽的房頂上張望涣觉。 院中可真熱鬧,春花似錦血柳、人聲如沸官册。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽膝宁。三九已至,卻和暖如春根吁,著一層夾襖步出監(jiān)牢的瞬間员淫,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工击敌, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留介返,地道東北人。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓沃斤,卻偏偏與公主長得像圣蝎,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子衡瓶,可洞房花燭夜當晚...
    茶點故事閱讀 44,901評論 2 355

推薦閱讀更多精彩內容