函数
    函数是js应用程序的基础。它帮助你实现抽象层,模拟类,信息隐藏和模块。在Ts中支持类,命名空间和模块
    但函数仍然是主要的定义行为的地方。Ts为js函数添加了额外的功能,更容易使用。
    Ts函数可以创建有名字的函数和匿名函数。可随意选择适合应用程序的方式
    js函数的表达语法:

    1. // 第一种
    2. function add (x,y) {
    3. return x+y
    4. }
    5. // 第二种
    6. let myAdd = function(x,y) {return x + y}

    js函数外可以声明变量,在函数内部使用

    1. let c = 100
    2. function add2 (xy) {
    3. return x + y + c
    4. }

    函数类型
    为函数定义类型:

    1. // 第一种
    2. function add (x:number, y:number):number {
    3. return x+y
    4. }
    5. // 第二种
    6. let myadd = function{x:number,y:number} :number {return x+y}
    7. // 我们可以把每个参数添加类型之后再为函数本身添加返回值类型,Ts根据返回值语句自动推断出返回类型

    完整函数类型:

    1. let add:(xnumberynumber) => number = function(x:number,y:number):number{return x+y}

    函数类型包括两部分:参数类型和返回值类型,为没各参数指定一个名字和类型,为了增加可读性,也可以写成

    1. let add:(baseValue:number,increment:number) =>number=function(x:number,y:number):number{
    2. return x + y
    3. }
    4. // 只要参数类型是匹配的,认为它是最有效的函数类型,不在乎参数名。

    第二部分是返回值类型。对于返回值,我们在函数和返回值类型之前使用(=>)符号,如果之前提到,返回类型时函数类型的必要部分,如果函数没有返回值,也必须指定返回值类型为voild而不能留空。
    推断类型
    如果在赋值语句的一边指定了类型但是另一边没有类型的话,Ts编译器会自动识别出类型。

    let myAdd: (baseValue: number, increment: number) => number =
        function(x, y) { return x + y; };
    

    可选参数和默认参数
    Ts里的每个函数都是必须的,不是指不能传递null和undefined作为参数,而是编译器检查用户是否为每个参数都传入值,传递给一个函数的参数个数必须与函数期望的参数个数一致。

    function buildName(firstName:string,lastName:string) {
            return firstName + '' + lastName
    }
    let restult1 = buildName('Bob')  // error
    let restult2 = buildName('Bob','Adams')  // ah,just right
    

    Js里,每个参数都是可选的,可传可不传。没传参时,它的值就是undefined。在Ts里可以在参数名旁使用?实现参数可选的功能,如last name是可选的:

    function buildName(firstName:string,lastName?:string) {
            if(lastName)
          return firstName + '' + lastName
          else
          return firstName
    }
    let result1 = buildName('Bob') ; 
    let result2 = buildName('Bob','Adams','br') // error
    let result3 = buildName('Bob','Adams')
    // 可选参数必须跟在必须参数后面。
    

    在Ts里可以为参数提供一个默认值当用户没有传递这个参数或传入的值是undefined时。他们叫做有默认初始化值的参数。把last name的默认值设置为Smith

    function buildName(firstName:string,lastName='Smith'){
            return firstName + '' + lastName
    }
    
    let a1 = buildName('Bob')   // 'Bob Smith'
    let a2 = buildName('Bob',undefind) // 'Bob Smith'
    let a3 = buildName('Bob','Adams') // 'Bob Adams'
    

    在所有必须参数后面的带默认初始化的参数都是可选的,与可选参数一样,在调用函数的时候可以省略,就是可选参数与末尾参数的默认参数共享参数类型。
    剩余参数
    必要参数,默认参数和可选参数有个共同点:它们表示某一个参数。相同时操作多个参数,或者你并不知道会有多少参数传递进来。在js里可以使用arguments访问传入的参数
    在Ts里。可以把所有的参数收集到一个变量里(如:展开运算符):

    function buildName(first:string,...restOf:string[]){
            return first + '' + restOf.jion('')
    }
    
    let buildNameFun: (fname: string, ...rest: string[]) => string = buildName;