TypeScript基礎入門 - 函數 - 重載

轉載node

TypeScript基礎入門 - 函數 - 重載

項目實踐倉庫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
相關文章
相關標籤/搜索