typescript--对象里面的方法参数中指定this,重载

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)

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值