﻿// Ensure TypeScript compiler is load for VS versions
// below 2015.
// https://www.microsoft.com/en-us/download/details.aspx?id=48739
// Will need a TypeScript definition file for jQuery
// jquery.d.ts (see NuGet jQuery.TypeScript.DefinedType)
$(function ()
{
    var output: string = "";

    // FUNCTIONS
    // Types can now be provided for arguments and returns (all are optional)
    function DisplayLine(text: string): void
    {
        output = output + text + "<br/>";
    }

    function DisplayNumber(num: number): void
    {
        DisplayLine("Number is " + num);
        if (num > 100)
        {
            DisplayLine("Number is very large");
        }
    }

    function AddNumbers(number1: number, number2: number): number
    {
        return number1 + number2;
    }

    var result: number = AddNumbers(2, 3);
    DisplayNumber(result);

    // Function Types
    // Variables can also contain functions
    var someFunction: (x: number, y: number) => number;   // Must use arrow to specify return type

    someFunction = AddNumbers;
    result = someFunction(2, 3);
    DisplayNumber(result);

    // Can do optional and default parameters
    //function DisplayNameOpt(firstName: string, lastName?: string) : string              // ? means optional
    //{
    //    return lastName ? firstName + " " + lastName : firstName;
    //}
    //DisplayLine(DisplayNameOpt("Fred"));    // Displays just "Fred"

    //function DisplayNameDef(firstName: string, lastName: string = "Smith"): string     // Default value
    //{
    //    return firstName + " " + lastName;
    //}
    //DisplayLine(DisplayNameDef("Fred"));    // Displays just "Fred Smith"

    // You can use the type "any" or just not provide the type.
    function GiveValueBack(someValue: any): any     // Or just "function GiveValueBack(someValue)"
    {
        return someValue;
    }

    var strResult: string = GiveValueBack("Hello");
    DisplayLine(strResult);
    var numResult: number = GiveValueBack(33);
    DisplayLine(numResult + "");

    document.body.innerHTML = output;
});  