TypeScript系列(六):泛型

指在定義函數(shù)殴蹄、接口或類的時(shí)候,不預(yù)先指定具體的類型猾担,而在使用的時(shí)候再指定具體類型的一種特性袭灯。

引入

下面創(chuàng)建一個(gè)函數(shù), 實(shí)現(xiàn)功能: 根據(jù)指定的數(shù)量 count 和數(shù)據(jù) value , 創(chuàng)建一個(gè)包含 count 個(gè) value 的數(shù)組 不用泛型的話,這個(gè)函數(shù)可能是下面這樣:

function createArray(value: any, count: number): any[] {
  const arr: any[] = []
  for (let index = 0; index < count; index++) {
    arr.push(value)
  }
  return arr
}

const arr1 = createArray(11, 3)
const arr2 = createArray('aa', 3)
console.log(arr1[0].toFixed(), arr2[0].split(''))

使用函數(shù)泛型

function createArray2 <T> (value: T, count: number) {
  const arr: Array<T> = []
  for (let index = 0; index < count; index++) {
    arr.push(value)
  }
  return arr
}
const arr3 = createArray2<number>(11, 3)
console.log(arr3[0].toFixed())
// console.log(arr3[0].split('')) // error
const arr4 = createArray2<string>('aa', 3)
console.log(arr4[0].split(''))
// console.log(arr4[0].toFixed()) // error

多個(gè)泛型參數(shù)的函數(shù)

一個(gè)函數(shù)可以定義多個(gè)泛型參數(shù)

function swap <K, V> (a: K, b: V): [K, V] {
  return [a, b]
}
const result = swap<string, number>('abc', 123)
console.log(result[0].length, result[1].toFixed())

泛型接口

在定義接口時(shí), 為接口中的屬性或方法定義泛型類型
在使用接口時(shí), 再指定具體的泛型類型

interface IbaseCRUD <T> {
  data: T[]
  add: (t: T) => void
  getById: (id: number) => T
}

class User {
  id?: number; //id主鍵自增
  name: string; //姓名
  age: number; //年齡

  constructor (name, age) {
    this.name = name
    this.age = age
  }
}

class UserCRUD implements IbaseCRUD <User> {
  data: User[] = []
  
  add(user: User): void {
    user = {...user, id: Date.now()}
    this.data.push(user)
    console.log('保存user', user.id)
  }

  getById(id: number): User {
    return this.data.find(item => item.id===id)
  }
}

const userCRUD = new UserCRUD()
userCRUD.add(new User('tom', 12))
userCRUD.add(new User('tom2', 13))
console.log(userCRUD.data)

泛型類

在定義類時(shí), 為類中的屬性或方法定義泛型類型 在創(chuàng)建類的實(shí)例時(shí), 再指定特定的泛型類型

class GenericNumber<T> {
  zeroValue: T
  add: (x: T, y: T) => T
}

let myGenericNumber = new GenericNumber<number>()
myGenericNumber.zeroValue = 0
myGenericNumber.add = function(x, y) {
  return x + y 
}

let myGenericString = new GenericNumber<string>()
myGenericString.zeroValue = 'abc'
myGenericString.add = function(x, y) { 
  return x + y
}

console.log(myGenericString.add(myGenericString.zeroValue, 'test'))
console.log(myGenericNumber.add(myGenericNumber.zeroValue, 12))

泛型約束

如果我們直接對(duì)一個(gè)泛型參數(shù)取 length 屬性, 會(huì)報(bào)錯(cuò), 因?yàn)檫@個(gè)泛型根本就不知道它有這個(gè)屬性

// 沒有泛型約束
function fn <T>(x: T): void {
  // console.log(x.length)  // error
}

我們可以使用泛型約束來(lái)實(shí)現(xiàn)

interface Lengthwise {
  length: number;
}

// 指定泛型約束
function fn2 <T extends Lengthwise>(x: T): void {
  console.log(x.length)
}

我們需要傳入符合約束類型的值绑嘹,必須包含必須 length 屬性:

fn2('abc')
// fn2(123) // error  number沒有l(wèi)ength屬性
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末稽荧,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子工腋,更是在濱河造成了極大的恐慌姨丈,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件擅腰,死亡現(xiàn)場(chǎng)離奇詭異蟋恬,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)趁冈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門歼争,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人渗勘,你說(shuō)我怎么就攤上這事沐绒。” “怎么了呀邢?”我有些...
    開封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵洒沦,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我价淌,道長(zhǎng)申眼,這世上最難降的妖魔是什么瞒津? 我笑而不...
    開封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮括尸,結(jié)果婚禮上巷蚪,老公的妹妹穿的比我還像新娘。我一直安慰自己濒翻,他們只是感情好屁柏,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著有送,像睡著了一般淌喻。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上雀摘,一...
    開封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天裸删,我揣著相機(jī)與錄音,去河邊找鬼阵赠。 笑死涯塔,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的清蚀。 我是一名探鬼主播匕荸,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼枷邪!你這毒婦竟也來(lái)了榛搔?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤齿风,失蹤者是張志新(化名)和其女友劉穎药薯,沒想到半個(gè)月后绑洛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體救斑,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年真屯,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了脸候。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡绑蔫,死狀恐怖运沦,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情配深,我是刑警寧澤携添,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站篓叶,受9級(jí)特大地震影響烈掠,放射性物質(zhì)發(fā)生泄漏羞秤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一左敌、第九天 我趴在偏房一處隱蔽的房頂上張望瘾蛋。 院中可真熱鬧,春花似錦矫限、人聲如沸哺哼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)取董。三九已至,卻和暖如春无宿,著一層夾襖步出監(jiān)牢的瞬間甲葬,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工懈贺, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留经窖,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓梭灿,卻偏偏與公主長(zhǎng)得像画侣,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子堡妒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

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