TS-10 面向對象-class 上

  • 基礎聲明:和interface很像
  • 區別:
  1. interface只有成員的類型沒有實現以及初始化
  2. class需要同時有成員的類型和實現
interface PointInterface {
  x: number
  y: number
}

const p1:PointInterface = {
  x: 1,
  y: 2
}
// 要有默認值,不然嚴格模式下 ts 會報錯
class PointClass {
  // 這里的意思是初始化的時候 this.x = 0,和寫在 constructor 的意思是一樣的,都是進行初始化
  x:number = 0
  y:number = 0
}
// ---or---
class PointClass {
  x: number
  y: number
  constructor(x = 0, y = 0){
    this.x = x
    this.y = y
  }
}

const p2 = new PointClass(1,2)
console.log(p2)
  • 上述聲明簡化:每個參數都要加 public,并且public只能用于typescript
class PointClass {
 constructor(public x = 0,public y= 0){}
}

const p = new PointClass()
console.log(p)
  • constructor也可以用重載
  • class也可以使用索引簽名
class Hash {
  [s:string]: unknown

  set(key:string,value:unknown){
    this[key] = value
  }

  get(key:string){
    return this[key]
  }
}
  • class實現接口implements實現的意思就是你有的我都有。但是interface里的可選屬性,在class也依然要實現,不然使用時會報錯
interface Person{
  name: string
  sayHi: (target: Person) => void
}

// User的類型只要是Person的子集就行,即被Person類型兼容就可以
class User implements Person{
  constructor(public name:string){
  }
  sayHi(target:Person){
    console.log(`Hi, ${target.name}`)
  }
}

const user = new User('frank')
console.log(user.name)
  • class還可以實現多個接口,方法和一個接口類似,就是全部完善就行
  • class繼承class
class Person {
  constructor(public name:string){}
  sayHi(){
    console.log(`Hi, I am ${this.name}`)
  }
}

class User extends Person {
  id: number
  constructor(name:string,id: number){
    super(name) // 執行父類的構造函數
    this.id = id
  }
  login(){}
  sayHi(target?: User){
    if(target === undefined){
      super.sayHi()
    }else{
      console.log('我是 User 的 sayHi')
    }
  }
}

const user = new User('frank',1)
user.sayHi() // Hi, I am frank
user.sayHi(user) // 我是 User 的 sayHi
console.log(user)
  • declare: 改變父類屬性類型
class Person {
  friend?: Person
  constructor(public name:string,friend?:Person){
    this.friend = friend
  }
}

class User extends Person{
  declare friend?: User
  constructor(name:string,friend?:User){
    super(name,friend)
  }
}

const u1 = new User('frank')
const u2 = new User('ricky',u1)

console.log(u2.friend) // User 類型,不加declare的話,friend就是父類Person類型
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 附加修飾符: static 類成員: 類成員由static關鍵字修飾 特點:可以在未創建類的對象前就用類名直接調用...
    赤色黎明_9970閱讀 461評論 0 0
  • 八、面向對象 1. 面向對象的三個階段 面向對象分析 OOA --> Object Oriented Analys...
    250deb66c358閱讀 462評論 0 0
  • java繼承 繼承的概念 繼承是java面向對象編程技術的一塊基石,因為它允許創建分等級層次的類。 繼承就是子類繼...
    863cda997e42閱讀 687評論 0 1
  • 繼承性的理解 為描述和處理 個人信息,定義類Person: 為描述和處理 學生信息,定義類Student: 通過繼...
    是小豬童鞋啦閱讀 288評論 0 0
  • [TOC] 第一章:面向對象-概述 1.1-什么是面向對象? 概述 面向對象是一種程序設計思想。 程序設計的目的是...
    雷噠噠閱讀 319評論 0 1