{/**
* @函数类型
*/const add =(x:number, y:number):number=>{return x + y
}console.log('add',add(1,2))// 类型说明 (x: number, y: number) => numberconstadd2:(x:number, y:number)=>number=function(
x:number,
y:number):number{return x + y
}// 类型别名简化typeFnType=(x:number, y:number)=>numberconst add3:FnType=(x, y)=>{return x + y
}console.log('add3',add3(1,2))/**
* @可选参数
* 可选参数必须跟在必须参数后面
* 在所有必须参数后面的带默认初始化的参数都是可选的
* 与普通可选参数不同的是,带默认值的参数不需要放在必须参数的后面。 如果带默认值的参数出现在必须参数前面,用户必须明确的传入undefined值来获得默认值
*/functionbuildName(firstName:string='Will', lastName?:string){return firstName +' '+ lastName
}// let result1 = buildName('Bob') // error, too few parameters// let result2 = buildName('Bob', 'Adams', 'Sr.') // error, too many parameterslet result3 =buildName('Bob','Adams')// okay and returns "Bob Adams"let result4 =buildName(undefined,'Adams')// okay and returns "Will Adams"/**
* @剩余参数
*/functionbuildName2(firstName:string,...restOfName:string[]){return firstName +' '+ restOfName.join(' ')}letbuildNameFun:(fname:string,...rest:string[])=>string= buildName2
/**
* @this
*/let deck ={
suits:['hearts','spades','clubs','diamonds'],
cards:Array(52),createCardPicker:function(){// NOTE: the line below is now an arrow function, allowing us to capture 'this' right herereturn()=>{let pickedCard = Math.floor(Math.random()*52)let pickedSuit = Math.floor(pickedCard /13)return{ suit:this.suits[pickedSuit], card: pickedCard %13}}}}let cardPicker = deck.createCardPicker()let pickedCard =cardPicker()console.log('card: '+ pickedCard.card +' of '+ pickedCard.suit)/**
* @重载
*/let suits =['hearts','spades','clubs','diamonds']functionpickCard(x:{ suit:string; card:number}[]):numberfunctionpickCard(x:number):{ suit:string; card:number}functionpickCard(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 cardif(typeof x =='object'){let pickedCard = Math.floor(Math.random()* x.length)return pickedCard
}// Otherwise just let them pick the cardelseif(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)]console.log('card: '+ pickedCard1.card +' of '+ pickedCard1.suit)let pickedCard2 =pickCard(15)console.log('card: '+ pickedCard2.card +' of '+ pickedCard2.suit)}