babelcodes
9/29/2017 - 8:53 PM

TypeScript > Function ▶︎ http://babel.codes/TypeScript/Function

TypeScript > Function ▶︎ http://babel.codes/TypeScript/Function

/**
 * Table of content:
 *
 * 1/ Definition
 * 2/ Types
 * 3/ Optional and Default Parameters
 * 4/ Rest Parameters
 * 5/ See `this`
 * 6/ Overloads
 *
 */

// 1/ Definition: a) Named function
function add(x, y)                         { return x + y; }
// 2/ Types: a) Typing parameters (Named function)
function add(x: number, y: number): number { return x + y; }


// 1/ Definition: b) Anonymous function
let myAdd = function(x, y)                         { return x + y; };
// 2/ Types: a) Typing parameters (Anonymous function)
let myAdd = function(x: number, y: number): number { return x + y; };
// 2/ Types: b) Function type
let myAdd: (something: number, somethingElse: number) => number =
    function(x: number, y: number): number { return x + y; };

// 3/ Optional and Default Parameters: a) Required (by default)
function buildName(firstName: string, lastName: string) {
    return firstName + " " + lastName;
}
let result1 = buildName("Bob");                  // ERROR, too few parameters
let result2 = buildName("Bob", "Adams", "Sr.");  // ERROR, too many parameters
let result3 = buildName("Bob", "Adams");         // ah, just right
// 3/ Optional and Default Parameters: b) Optional
function buildName(firstName: string, lastName?: string) {
    if (lastName)
        return firstName + " " + lastName;
    else
        return firstName;
}
let result1 = buildName("Bob");                  // works correctly now
let result2 = buildName("Bob", "Adams", "Sr.");  // ERROR, too many parameters
let result3 = buildName("Bob", "Adams");         // ah, just right
// 3/ Optional and Default Parameters: c) Default-initialized parameters
function buildName(firstName = "Will", lastName: string) {
    return firstName + " " + lastName;
}

let result1 = buildName("Bob");                  // error, too few parameters
let result2 = buildName("Bob", "Adams", "Sr.");  // error, too many parameters
let result3 = buildName("Bob", "Adams");         // okay and returns "Bob Adams"
let result4 = buildName(undefined, "Adams");     // okay and returns "Will Adams"

// 4/ Rest Parameters
function buildName(firstName: string, ...restOfName: string[]) {
    return firstName + " " + restOfName.join(" ");
}
let employeeName = buildName("Joseph", "Samuel", "Lucas", "MacKinzie");

// 6/ Overloads

let suits = ["hearts", "spades", "clubs", "diamonds"];

function pickCard(x: {suit: string; card: number; }[]): number; // Overloads #1
function pickCard(x: number): {suit: string; card: number; };   // Overloads #2
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") {
        let pickedCard = Math.floor(Math.random() * x.length);
        return pickedCard;
    }
    // Otherwise just let them pick the card
    else if (typeof x == "number") {
        let pickedSuit = Math.floor(x / 13);
        return { suit: suits[pickedSuit], card: x % 13 };
    }
}

let myDeck = [{ suit: "diamonds", card: 2 }, { suit: "spades", card: 10 }, { suit: "hearts", card: 4 }];
let pickedCard1 = myDeck[pickCard(myDeck)];
alert("card: " + pickedCard1.card + " of " + pickedCard1.suit);

let pickedCard2 = pickCard(15);
alert("card: " + pickedCard2.card + " of " + pickedCard2.suit);