官方文檔地址:https://www.typescriptlang.org/docs/handbook/generics.html
中文文檔:https://www.tslang.cn/docs/handbook/generics.html
什么是泛型呢?
泛型随闪,簡(jiǎn)單來(lái)說(shuō)就是類型變量舆瘪。在ts中存在類型忌警,類型如number
兜畸、string
含思、boolean
等蔗衡,泛型就是使用一個(gè)類型變量來(lái)表示一種類型再榄,類型值通常是在使用的時(shí)候才會(huì)設(shè)置。泛型的使用場(chǎng)景非常多襟诸,可以在函數(shù)瓦堵、類甚至interface中使用。
如:我們編寫(xiě)一個(gè)類似lodash.find
的方法
function find<T>(items: T[], callback: (item: T, index: number) => boolean): T | undefined {
for (let i = 0, length = items.length; i < length; i++) {
if (callback(items[i], i)) {
return items[i]
}
}
}
const items = [{ a: 1 }, { a: 2 }, { a: 4 }, null ]
const result = find(items, (item, index) => item.a === 2)
首先<T>
是給函數(shù)聲明了一個(gè)類型變量T歌亲,后面要求items
是一個(gè)T
類型的數(shù)組菇用,然后后面的callback
函數(shù)的參數(shù)item
是一個(gè)T
類型的變量,index
為數(shù)字陷揪,然后callback
返回boolean
類型結(jié)果惋鸥,整個(gè)find
函數(shù)返回T
類型結(jié)果或者undefined
如上,我們就能準(zhǔn)確定義函數(shù)的每一個(gè)參數(shù)了悍缠,參數(shù)與參數(shù)卦绣,參數(shù)與返回結(jié)果之間就形成了約束關(guān)系
在使用的時(shí)候,由于定義了數(shù)組的元素必須是同一種類型飞蚓,所以編譯時(shí)就會(huì)提示錯(cuò)誤
如果沒(méi)有使用泛型滤港,我們就只能使用any
定義每一個(gè)參數(shù)了,如下
function find(items: any[], callback: (item: any, index: number) => boolean): any {
for (let i = 0, length = items.length; i < length; i++) {
if (callback(items[i], i)) {
return items[i]
}
}
}
const items = [{ a: 1 }, { a: 2 }, { a: 4 }, null ]
const result = find(items, (item, index) => item.a === 2)
以上代碼趴拧,ts編譯是可以通過(guò)的溅漾,但很明顯是非常不嚴(yán)謹(jǐn)?shù)模瑢?duì)于items的定義就可以很寬泛了著榴,然而使用泛型的時(shí)候就限制了只能是某一種類型的數(shù)組樟凄,這樣就可以把可能出現(xiàn)的錯(cuò)誤在開(kāi)發(fā)時(shí)就找出來(lái)
簡(jiǎn)單總結(jié)心得,有不正確的地方還請(qǐng)指正兄渺。
歡迎關(guān)注我: https://github.com/nashaofu