TypeScript全解:class(上)

為什么需要類呢蓬坡?

  1. 外來(lái)人口多,迫切需要 class(以前是沒(méi)有專門(mén)的前端的,都是其他方向轉(zhuǎn)行來(lái)的)
  2. class 是保留字腮鞍,遲早要實(shí)現(xiàn) class
  3. 大部分人對(duì)原型的理解不夠(因?yàn)榇蠖鄶?shù)都語(yǔ)言是使用 class 來(lái)描述面向?qū)ο螅?/li>

語(yǔ)法

// 寫(xiě)法一
class PointClass {
  x: number = 0
  y: number = 0
}

// 寫(xiě)法二
class PointClass {
  x: number
  y: number
  constructor() {
    this.x = 0
    this.y = 0
  }
}

// 寫(xiě)法三
class PointClass {
  x!: number // 這里必須斷言,因?yàn)槌跏蓟辉?constructor 的明面上
  y!: number
  constructor() {
    this.xxx()  
  }
  xxx() {
    this.x = 0
    this.y = 0
  }
}

來(lái)看一組對(duì)比:

interface PointInterface {
  x: number;
  y: number;
}

// TODO: 注意:下面這個(gè)示例在 JS 中可以的莹菱,在 TS 中會(huì)報(bào)錯(cuò)
class PointClass {
  x: number;
  y: number;
}

看起來(lái)很像是吧~
interface 只有成員的類型沒(méi)有實(shí)現(xiàn)
class 須同時(shí)有成員的類型和實(shí)現(xiàn)

其實(shí)這個(gè)才是我最喜歡的寫(xiě)法:

class Point {
  constructor(public x: number = 0, public y: number = 0) {
  }
}

函數(shù)重載

class Point {
  x!: number;
  y!: number;
  constructor(x: number, y: number);
  constructor(s: string);
  constructor(xs: number | string, y?: number) {
    if (typeof xs === 'number' && typeof y === 'number') {
      this.x = xs
      this.y = y
    } else if (typeof === 'string') {
      const parts = xs.split(',')
      this.x = parseFloat(parts[0])
      this.y = parseFloat(parts[1])
    }
  }
}

看起來(lái)有點(diǎn)復(fù)雜把~

class 可以實(shí)現(xiàn)接口

使用 implements

interface Person {
  name: string;
  sayHi: (target: Person) => void
}

class User implements Person {
  constructor(public name: string) {}
  sayHi(target: Person) {
    console.log(`Hi ${target.name}`)
  }
}

實(shí)現(xiàn)是什么意思移国?就是你有的我都有,那這個(gè)不是和繼承差不多嘛
確實(shí)差不多道伟,但是你“繼承”一個(gè)接口迹缀,就叫做實(shí)現(xiàn)。接口繼承接口蜜徽,類繼承類祝懂,那才叫做繼承
面向?qū)ο髮?duì)就喜歡整這些有的沒(méi)的的概念

實(shí)現(xiàn)兩個(gè)接口

interface Person {
  name: string;
  sayHi: (target: Person) => void
}
interface Tag {
  tag: string[];
}

class User implements Person, interface {
  tag: string[] = []
  constructor(public name: string) {
    this.name = '1'
  }
  sayHi(target: Person) {
    console.log(`Hi ${target.name}`)
  }
}

思考:來(lái)看一個(gè)問(wèn)題

interface Person {
  name: string;
  age?: number;
  sayHi: (target: Person) => void
}

class User implements Person {
  constructor(public name: string) {}
  sayHi(target: Person) {
    console.log(`Hi ${target.name}`)
  }
}

const u = new User('jack')

u.age // TODO: 這里會(huì)出現(xiàn)什么樣的結(jié)果

問(wèn):u.age 的值是多少?

  1. 0
  2. undefined
  3. typescript 報(bào)錯(cuò)

很顯然是報(bào)錯(cuò)拘鞋,
Person 是一個(gè)接口啊砚蓬,又不會(huì)幫你實(shí)現(xiàn),你的 User 也沒(méi)有實(shí)現(xiàn) age盆色,所以是報(bào)錯(cuò)

class 可以繼承 class

class Person {
  constructor(public name: string) {}
  sayHi() {
    console.log(`Hi ${thyis.name}`)
  }
}

class User extends Person {
  constructor(public id: number, name: string) {
    super(name)
  }
  login() {}
  sayHi(target?: User) { // TODO: 注意:這叫做重寫(xiě)
    if (target === undefined) {
      supper.sayHi()
    } else {
      console.log(`你好灰蛙,${target.name}祟剔, 我是${this.name}`)
    }
  }
}

注意這里需要調(diào)用 super
為什么是這個(gè)單詞?因?yàn)槊嫦驅(qū)ο笏謥?lái)了摩梧,
通常我們都說(shuō)父類和子類物延,而偏偏面向?qū)ο笠凶?strong>超類,就是喜歡發(fā)明概念

關(guān)于重寫(xiě)的一個(gè)思考

再來(lái)看一個(gè)栗子

class Person {
  friend?: Person
  constructor(public name: string, friend?: Person) {
    this.friend = friend
  }
}

class User extends Person {
  constructor(public id: number, name: string, friend?: User) {
    super(name, friend)
  }
  login() {}
  sayHi(target?: User) { // TODO: 注意:這叫做重寫(xiě)
    if (target === undefined) {
      supper.sayHi()
    } else {
      console.log(`你好障本,${target.name}教届, 我是${this.name}`)
    }
  }
}

const u1 = new User(1, 'jack')
const u2 = new User(1, 'jack2', u1)

u2.friend // TODO: 請(qǐng)問(wèn)這里的類型是什么

請(qǐng)問(wèn)這里的 u2.friend 類型是什么?

直接看答案:

很奇怪把驾霜,明明傳進(jìn)去的 u1案训,類型是 User,怎么顯示出來(lái)是 Person粪糙?强霎!

可能是因?yàn)槲覀冊(cè)?User 的時(shí)候并沒(méi)有實(shí)現(xiàn) friend,friend 是在 Person 實(shí)現(xiàn)的蓉冈,自然會(huì)用 Person 里的 friend 的類型
所以我們要怎么做呢城舞?用類型重寫(xiě)

class Person {
  friend?: Person
  constructor(public name: string, friend?: Person) {
    this.friend = friend
  }
}

class User extends Person {
  declare friend?: User // TODO: 注意這里:需要使用 declare
  constructor(public id: number, name: string, friend?: User) {
    super(name, friend)
  }
  login() {}
  sayHi(target?: User) { // TODO: 注意:這叫做重寫(xiě)
    if (target === undefined) {
      supper.sayHi()
    } else {
      console.log(`你好,${target.name}寞酿, 我是${this.name}`)
    }
  }
}

好家夺,面向?qū)ο笥謥?lái)事了,
想直接覆蓋伐弹?不可以拉馋,只能用我提供的關(guān)鍵詞 declare 來(lái)覆蓋

最后再來(lái)思考一個(gè)問(wèn)題

這里的 friend 是 User 的還是 Person 的?

其實(shí)這個(gè)問(wèn)題沒(méi)必要糾結(jié)惨好,之所以問(wèn)出這個(gè)問(wèn)題是因?yàn)槟闵钍茉玩湹挠绊?/p>

原型鏈和 class 是兩個(gè)不同的流派煌茴,沒(méi)人會(huì)關(guān)心你這個(gè)東西是在哪里實(shí)現(xiàn)的,沒(méi)人會(huì)關(guān)心你這個(gè)是獨(dú)有屬性日川,還是共有屬性蔓腐,只要給你實(shí)現(xiàn)出來(lái)就行了

最后提醒一點(diǎn),如果你在學(xué)習(xí)另一門(mén)語(yǔ)言龄句,在你沒(méi)學(xué)會(huì)之前回论,千萬(wàn)不要把這兩個(gè)語(yǔ)言進(jìn)行對(duì)比炎咖,這樣只會(huì)搞的更混亂

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末淘衙,一起剝皮案震驚了整個(gè)濱河市赐俗,隨后出現(xiàn)的幾起案子秧秉,更是在濱河造成了極大的恐慌,老刑警劉巖梦碗,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡繁调,警方通過(guò)查閱死者的電腦和手機(jī)萨蚕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)蹄胰,“玉大人岳遥,你說(shuō)我怎么就攤上這事≡U” “怎么了浩蓉?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)宾袜。 經(jīng)常有香客問(wèn)我捻艳,道長(zhǎng),這世上最難降的妖魔是什么庆猫? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任认轨,我火速辦了婚禮,結(jié)果婚禮上月培,老公的妹妹穿的比我還像新娘嘁字。我一直安慰自己,他們只是感情好杉畜,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布纪蜒。 她就那樣靜靜地躺著,像睡著了一般此叠。 火紅的嫁衣襯著肌膚如雪纯续。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 48,970評(píng)論 1 284
  • 那天拌蜘,我揣著相機(jī)與錄音杆烁,去河邊找鬼。 笑死简卧,一個(gè)胖子當(dāng)著我的面吹牛兔魂,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播举娩,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼析校,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了铜涉?” 一聲冷哼從身側(cè)響起智玻,我...
    開(kāi)封第一講書(shū)人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎芙代,沒(méi)想到半個(gè)月后吊奢,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡纹烹,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年页滚,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了召边。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡裹驰,死狀恐怖隧熙,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情幻林,我是刑警寧澤贞盯,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站沪饺,受9級(jí)特大地震影響躏敢,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜随闽,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一父丰、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧掘宪,春花似錦蛾扇、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至鼠次,卻和暖如春更哄,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背腥寇。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工成翩, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人赦役。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓麻敌,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親掂摔。 傳聞我的和親對(duì)象是個(gè)殘疾皇子术羔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容