一文章說清楚,TypeScript 的泛型

●?泛型( generic ) : 先來看一下百度給出的中文解釋

●?這一章我們就來學(xué)習(xí)一下什么是 TS 內(nèi)的泛型
泛型
●?廢話不多說, 直接上例子
初識泛型
●?一個函數(shù), 需要參數(shù)是 number 數(shù)據(jù)類型, 返回值也是 number 數(shù)據(jù)類型
●?又一個函數(shù), 需要參數(shù)是 string 類型, 返回值也是 string 數(shù)據(jù)類型
●?我們發(fā)現(xiàn), 我們給函數(shù)的參數(shù)和返回值都進(jìn)行了限制
○?假設(shè), 如果兩段代碼的業(yè)務(wù)邏輯一樣
○?我們可以不可把兩個函數(shù)寫成一個
○?需求 : 我傳遞的是 數(shù)字, 返回值就是數(shù)字, 傳遞的是 字符串, 返回值就是 字符串
●? 思考過后, 我們想到可以用 或( | )
○?看起來不錯
○?但是不能完全滿足我們的需求
■?參數(shù) number 返回值 number
■?參數(shù) number 返回值 string
■?參數(shù) string 返回值 number
■?參數(shù) string 返回值 string
○?以上四種情況都是可以的
○?和我們預(yù)期的需求不一樣
●?我也可以寫成 any 類型不就好了
○?這樣一來, 好像對參數(shù)和返回值的限制又都沒有了
○?那么 TS 的意義好像不大了
●?難道說用了 TS 以后, 我們的代碼反而不靈活了嗎 ?
●?來看下面一段代碼
○?這個玩意看起來怪怪的, 感覺認(rèn)識但又不完全認(rèn)識
○?這里函數(shù)名后面的 "<T>" 表示給該函數(shù)定義了一個泛型, 就是預(yù)設(shè)了一個類型限制
○?將來你調(diào)用這個函數(shù)的時候, 來傳遞一個類型對函數(shù)進(jìn)行約束
○?在來思考我們一開始的需求, 其實(shí)主要就是取決于調(diào)用的時候
●?泛型, 其實(shí)就是在定義階段不預(yù)先指定具體類型, 只是留下一個空位或者預(yù)設(shè)位置, 當(dāng)你使用的時候在決定使用什么具體的數(shù)據(jù)類型填充
泛型用法
1.? 函數(shù)泛型
○?就是利用泛型限定函數(shù)的參數(shù)和返回值
○?也可以設(shè)置多個泛型標(biāo)識符
○?泛型標(biāo)識符可以設(shè)置一個, 也可以設(shè)置多個, 用哪個字母無所謂
2.? 接口泛型
○?在定義接口的時候, 也可以使用泛型
○?這樣看起來, 泛型是不是非常方便呢
○?同樣, 也可以設(shè)置一個, 也可以設(shè)置多個
3.? 類泛型
○?在定義類的時候, 我們也可以加入一些泛型限制一些內(nèi)容
斷言
●?斷言是一個非常有意思的小玩意, 有的時候可以在我無助的時候給我?guī)硪唤z希望
●?我一直覺得斷言就是 "奧特曼"

●?看一個例子
○?在正常不過的一段代碼了, 這個有啥的
○?寫完我們才發(fā)現(xiàn)

●?為什么 ? 為什么 ?

●?會不會是因?yàn)槲叶x ele 變量的時候, 沒有限制類型呢

●?這回下面好了, 上面又出問題了
●?解釋一下吧
○?其實(shí)是因?yàn)? 我們獲取元素這個操作, 是有可能獲取不到的
○?當(dāng)我們獲取不到的時候就是 null
○?就不是 HTMLDivElement 這個類型了
○?所以在哪個地方限制好以后, 都會出現(xiàn)問題的
●?怎么辦呢, 這個時候, 就可以使用斷言了
○?斷言其實(shí)就是我主觀給他強(qiáng)制定義一個類型, 這樣就不會出現(xiàn)問題了
○?這里我就強(qiáng)制把 ele 元素斷定為 HTMLDivElement 類型, 那么就不會出現(xiàn)問題了
●?其實(shí)在很多時候, 我們不確定, 或者拿不準(zhǔn)的時候, 我們都可以使用斷言來解決問題
○?先不讓他報錯, O(∩_∩)O~
○?剩下的后面再說