轉載node
項目實踐倉庫git
https://github.com/durban89/typescript_demo.git tag: 1.2.5
爲了保證後面的學習演示須要安裝下ts-node,這樣後面的每一個操做都能直接運行看到輸出的結果。github
npm install -D ts-node
後面本身在練習的時候能夠這樣使用typescript
npx ts-node 腳本路徑
JavaScript自己是個動態語言。 JavaScript裏函數根據傳入不一樣的參數而返回不一樣類型的數據是很常見的。以下實例npm
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);
運行後獲得類型以下結果dom
$ npx ts-node src/function_7.ts card: 2 of diamands card: 2 of spades
pickCard方法根據傳入參數的不一樣會返回兩種不一樣的類型。 若是傳入的是表明紙牌的對象,函數做用是從中抓一張牌。 若是用戶想抓牌,咱們告訴他抓到了什麼牌。 可是這怎麼在類型系統裏表示呢。方法是爲同一個函數提供多個函數類型定義來進行函數重載。 編譯器會根據這個列表去處理函數的調用。 下面咱們來重載 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函數在調用的時候會進行正確的類型檢查。ui
爲了讓編譯器可以選擇正確的檢查類型,它與JavaScript裏的處理流程類似。 它查找重載列表,嘗試使用第一個重載定義。 若是匹配的話就使用這個。 所以,在定義重載的時候,必定要把最精確的定義放在最前面。spa
注意,function pickCard(x: any): any並非重載列表的一部分,所以這裏只有兩個重載:一個是接收對象另外一個接收數字。 以其它參數調用 pickCard會產生錯誤。
本實例結束實踐項目地址
https://github.com/durban89/typescript_demo.git tag: 1.2.6