interface Card {
suit:string
card:number
}
interface Deck {
suits:string[]
cards:number[]
createCardPicker(this:Deck): () => Card
}
let deck:Deck = {
suits:['hearts','spades','clubs','diamonds'],
cards: Array(52),
createCardPicker(this:Deck) {
console.log(this)//deck--谁调用的就指向谁
return () => {
console.log(this)//deck
let pickedCard = Math.floor(Math.random()*52)
let pickedSuit = Math.floor(pickedCard/13)
return {
suit: this.suits[pickedSuit],
card: pickedSuit % 13
}
}
}
}
let d1 = deck.createCardPicker()()
console.log(d1,`card ${d1.card} of ${d1.suit}`)
j对象中函数中再使用普通函数,不使用箭头函数,this指向window;
若使用箭头函数,this指向箭头函数外部的方法体内的this,而这个方法是deck调用的,所以指向this
// let deck = {
// suits:['hearts','spades','clubs','diamonds'],
// cards: Array(52),
// createCardPicker() {
// console.log(this)//deck--谁调用的就指向谁
// // return () => {
// // console.log(this)//deck
// // }
// const _this = this
// return function() {
// // console.log(_this)//_this->deck,this=>indow--global
// let pickedCard = Math.floor(Math.random()*52)
// let pickedSuit = Math.floor(pickedCard/13)
// return {
// suit: _this.suits[pickedSuit],
// card: pickedSuit % 13
// }
// }
// }
// }
// let d1 = deck.createCardPicker()()
// console.log(d1)
重载
let suits = ['hearts','spades','clubs','diamonds']
// 重载能够更好的检查代码,让编辑器自动识别错误
//重载要把最精确的定义放在前面
function pickeCards(x: {suit:string,card:number}[]): number
function pickeCards(x:number):{suit:string,card:string}
//具体方法详情
function pickeCards(x):any {
if(Array.isArray(x)) {
let pickedCard = Math.floor(Math.random() * x.length)
return pickeCards
}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 = pickeCards(myDeck)
console.log(111,pickedCard1)
let pickedCard2 = pickeCards(15)
console.log(222,pickedCard2)