精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

泛型,很多人因它放棄學習TypeScript?

開發 前端
直到大學畢業我依舊沒有理解泛型的概念,可能你和我一樣覺得泛型很難,下面我會分享我的理解,希望對你有所幫助。

 

1、ts的泛型很難嗎?

如果你:

  1.  剛開始學ts
  2.  剛開始接觸泛型
  3.  正在掙扎得學習ts的泛型

看到以下代碼有沒有很疑惑? 

  1. function makePair<  
  2.   F extends number | string,  
  3.   S extends boolean | F  
  4. >() 

Java是和typescript一樣支持泛型的,當我在大學開始學習Java的時候,我還是一個菜鳥碼農,遇到難點(比如泛型)就直接跳過,能學多少學多少,回寢室就LOL開黑。直到大學畢業我依舊沒有理解泛型的概念,可能你和我一樣覺得泛型很難,下面我會分享我的理解,希望對你有所幫助。

2、一起來看一下makeState()這個函數

首先,我寫了makeState這個函數,我們會用這個函數來討論泛型 

  1. function makeState() {  
  2.   let state: number  
  3.   function getState() {  
  4.     return state  
  5.   }  
  6.   function setState(x: number) {  
  7.     state = x  
  8.   }  
  9.   return { getState, setState }  

當你運行這個函數,我們會得到getState() 和 setState()這兩個函數。

讓我們來試一下,下面這段代碼會打印出什么 

  1. const { getState, setState } = makeState()  
  2. setState(1)  
  3. console.log(getState())  
  4. setState(2)  
  5. console.log(getState())    
  1.  

會打印出1和2,沒那么難對吧?

Note: 如果你正在使用react,你可能會發覺,makeState()和鉤子函數useState()很像。這里也涉及到了閉包和ES6的解構賦值 

3、我們傳入字符串會如何?

我們把剛才給setState的入參1和2替換成字符串'foo'會輸出什么呢? 

  1. const { getState, setState } = makeState()  
  2. setState('foo')  
  3. console.log(getState())  
  1. Argument of type '"foo"' is not assignable to parameter of type 'number'. 

會編譯失敗,因為setState()需要的參數類型是number

我們可以用以下方法解決這個問題 

  1. function makeState() {  
  2.   // Change to string  
  3.   let state: string  
  4.   function getState() {  
  5.     return state  
  6.   }  
  7.   // Accepts a string  
  8.   function setState(x: string) {  
  9.     state = x  
  10.   }  
  11.   return { getState, setState }  
  12.  
  1. const { getState, setState } = makeState()  
  2. setState('foo')  
  3. console.log(getState()) 
  1. foo 

4、挑戰:獲取兩個不同類型的state

我們能不能修改makeState()這個函數,來輸出兩個不同類型的state,比如一個是字符串,一個是數字。

以下代碼簡略得表示我想表達的意思: 

  1. // One that only allows numbers, and…  
  2. const numState = makeState()  
  3. numState.setState(1)  
  4. console.log(numState.getState()) // 1  
  5. // The other that only allows strings.  
  6. const strState = makeState()  
  7. strState.setState('foo')  
  8. console.log(strState.getState()) // foo 

要達到以上效果,我們可能需要創建兩個內部不一樣的makeState(),一個state的類型是數字,一個是字符串。

怎么用才能只寫一個來實現呢?

5、實驗一:設置多個類型

這是我們的第一個嘗試: 

  1. function makeState() {  
  2.   let state: number | string  
  3.   function getState() {  
  4.     return state  
  5.   }  
  6.   function setState(x: number | string) {  
  7.     state = x  
  8.   }  
  9.   return { getState, setState }  
  10.  
  1. const numAndStrState = makeState()  
  2. //數字  
  3. numAndStrState.setState(1)  
  4. console.log(numAndStrState.getState())  
  5. //字符串  
  6. numAndStrState.setState('foo')  
  7. console.log(numAndStrState.getState())    
  1.  
  2. foo 

結果看上去我們貌似成功了,但是這并不是我真實想要的,我們真正要實現的是只能輸出數字state和只能輸出字符串state。

numAndStrState是既能輸出數字類型,又能輸出字符串類型

6、實現二:使用泛型

接下來我們的泛型要登場了: 

  1. function makeState<S>() {  
  2.   let state: S  
  3.   function getState() {  
  4.     return state  
  5.   }  
  6.   function setState(x: S) {  
  7.     state = x  
  8.   }  
  9.   return { getState, setState }  

makeState() 被定義成 makeState<S>(),你可以把<S>當作函數參數,但它傳入的不是值,而是類型。

比如你可以傳入數字類型: 

  1. makeState<number>() 

在makeSate()這個函數內部state會變成數字類型 

  1. let state: S // <- number  
  2. function setState(x: S /* <- number */) {  
  3.   state = x  

這樣就實現了只能輸出數字state 

  1. // Creates a number-only state  
  2. const numState = makeState<number>()  
  3. numState.setState(1)  
  4. console.log(numState.getState())  
  5. // numState.setState('foo') 輸入字符串foo會報錯 

同理我們也可以實現只能輸出字符串state 

  1. // Creates a string-only state  
  2. const strState = makeState<string>()  
  3. strState.setState('foo')  
  4. console.log(strState.getState())  
  5. // strState.setState(1) 輸入數字1會報錯 

Note: 我們把makeState<S>()稱作泛型函數,就是一個普通的函數支持類型參數的傳入

你可能會疑惑為什么類型參數是S, 其實隨便什么都可以,但是通常來說我們會用一個變量的第一個字母的大寫來代表這個變量的類型:

  •   T(for“T”ype)
  •   E(for“E”lement)
  •   K(for“K”ey)
  •   V(for“V”alue)

7、泛型的類型范圍限制

目前,在我們改進下的makeState()實現了只能輸出數字state和只能輸出字符串state。但是它也能實現輸出布爾值。 

  1. // Creates a boolean-only state  
  2. const boolState = makeState<boolean>()  
  3. boolState.setState(true)  
  4. console.log(boolState.getState()) 

問題:那么我們要如何限制它就只能輸入輸出number和string類型呢?

方法:聲明makeState()這個函數時,把類型參數<S>變為<S extends number | string>,這樣就只能輸入number或者string類型了 

  1. function makeState<S extends number | string>() {  
  2.   let state: S  
  3.   function getState() {  
  4.     return state  
  5.   }  
  6.   function setState(x: S) {  
  7.     state = x  
  8.   }  
  9.   return { getState, setState }  
  10.  
  11. // 如果我傳入boolean類型  
  12. const boolState = makeState<boolean>()  
  1. Type 'boolean' does not satisfy the constraint 'string | number'. 

8、泛型的默認類型

現在每次調用makeState()時,我們可以任意傳入<number> 或<string>類型,那怎么設置一個默認類型呢?

比如讓下面兩個語句起到相同的作用: 

  1. const numState1 = makeState()  
  2. const numState2 = makeState<number>() 

其實和給函數參數設置默認值一樣: 

  1. function makeState<S extends number | string = number>() 

這樣,變量state默認類型就是number了 

  1. const numState = makeState()  
  2. numState.setState(1)  
  3. console.log(numState.getState())  

9、總結

泛型其實可以當作普通函數在聲明時的一個參數,這個參數代表類型。

我們可以給函數值參數設置默認值,

也可以通過typescipt的泛型給函數類型參數設置默認值。 

  1. function regularFunc(x = 2 
  2. regularFunc()  
  1. function genericFunc<TT = number>()  
  2. genericFunc()  

 

責任編輯:龐桂玉 來源: segmentfault
相關推薦

2025-06-13 10:14:55

2024-06-13 10:37:30

2025-02-21 08:48:16

Typescript內置聯合類型

2024-09-12 08:32:42

2021-01-30 11:42:53

迭代器代碼元素

2021-02-22 13:14:00

計算機編程技術

2018-02-13 14:48:17

戴爾

2022-02-06 00:07:19

互聯網失業職業

2022-07-06 10:33:39

技術債務CIO

2017-12-13 15:57:12

2021-06-24 09:08:34

Java代碼泛型

2019-08-21 08:24:34

技術過濾器代碼

2021-12-14 07:40:08

前端

2020-06-29 08:28:36

v-for 解構函數

2020-11-16 11:24:00

Spring AOP數據庫

2014-05-09 15:29:21

2021-01-15 05:39:13

HashMapHashTableTreeMap

2020-06-08 19:16:52

大數據IT技術

2021-09-21 10:33:56

人工智能科學技術

2019-08-08 16:00:08

HTTPGETPOST
點贊
收藏

51CTO技術棧公眾號

日本女人一区二区三区| 96视频在线观看欧美| 久久亚洲综合色| 国产精品国产三级国产aⅴ9色| 少妇av片在线观看| 992kp免费看片| 国内精品久久久久久久久久久| 日韩午夜一区| 日韩一区二区欧美| 日本五十肥熟交尾| 青青在线精品| 欧美日韩一区二区三区| 黄色a级在线观看| 日本韩国一区| 国产精品影视在线观看| 国产精品久久不能| 五月天婷婷网站| 国产精品毛片一区二区在线看| 亚洲精品一区二区三区蜜桃下载 | 国产男男chinese网站| 亚洲日本免费电影| 色欧美片视频在线观看| 69sex久久精品国产麻豆| 日韩免费网站| 国产99re66在线视频| 老司机午夜精品视频| 欧美精品aaa| 欧美性生交大片| 日韩一级电影| 亚洲国产美女精品久久久久∴| 午夜剧场高清版免费观看| 综合另类专区| 亚洲成人手机在线| 欧美 国产 精品| 免费大片在线观看www| 久久久国产午夜精品| 精品国产aⅴ麻豆| 欧美一级性视频| 国产高清不卡一区| 99影视tv| 成人乱码一区二区三区| 国产精品一级片| 成人午夜在线视频一区| 一级特黄aaa大片在线观看| 天堂精品中文字幕在线| 欧美最猛性xxxxx免费| 日本在线观看视频网站| 黄色精品一区| 手机在线一区二区三区| 亚洲精品一区在线观看| 国内自拍偷拍视频| 天堂久久av| 欧美一级电影网站| av在线网站免费观看| 激情中国色综合| 欧美日韩一级视频| 男操女免费网站| 草莓视频成人appios| 欧日韩精品视频| 亚洲欧美视频二区| 国产精品3区| 日韩精品资源二区在线| 久久久国产精品久久久| 中文一区二区三区四区| 精品少妇一区二区三区在线播放 | 粉嫩av亚洲一区二区图片| 97碰碰视频| 免费a级片在线观看| 99久久精品情趣| 免费看成人午夜电影| 黄视频在线播放| 黄色激情在线播放| 先锋亚洲精品| 国产91免费观看| 亚洲一线在线观看| 国产一区999| 国产伦精品一区二区| 天堂av在线7| 亚洲国产经典视频| 天天爱天天做天天操| 99热99re6国产在线播放| 精品高清美女精品国产区| 50路60路老熟妇啪啪| 欧美黄页免费| 欧美白人最猛性xxxxx69交| 欧类av怡春院| 日韩久久久久| 久久久久久亚洲| 欧美在线视频精品| 国产九色精品成人porny| 国产一区二区三区色淫影院| 国产黄在线看| 亚洲综合色在线| 亚洲性生活网站| 欧美高清一级片| 麻豆视频久久| 欧美性jizz18性欧美| 日韩肉感妇bbwbbwbbw| 久久综合给合| 亚洲人成电影在线播放| 性欧美疯狂猛交69hd| 国产精品综合色区在线观看| 国产免费一区视频观看免费| 风流少妇一区二区三区91| 国产欧美日韩综合精品一区二区| 日产精品久久久久久久蜜臀| 韩国主播福利视频一区二区三区| 欧美一区二视频| 婷婷色一区二区三区| 黄色国产精品| 91精品在线观| 久久久久久久久亚洲精品| 亚洲欧美偷拍卡通变态| 日本黄网站免费| 精品午夜视频| 综合136福利视频在线| 欧美三级一区二区三区| 国产麻豆91精品| 日韩欧美精品在线不卡| 亚洲v.com| 欧美xfplay| 国内精品美女av在线播放| 伊人影院综合网| 99热免费精品在线观看| 91精品国产99久久久久久红楼| 成人在线免费电影| 疯狂做受xxxx高潮欧美日本| 韩国三级与黑人| 国产高清一区| 国产精品一区二区性色av| 国产青青草在线| 日韩欧美在线网址| 中文乱码人妻一区二区三区视频| 欧美韩日精品| 91中文在线视频| 日本美女高清在线观看免费| 欧洲日韩一区二区三区| 国产jk精品白丝av在线观看| 99精品视频免费全部在线| 成人动漫视频在线观看免费| 18在线观看的| 日韩一级片网站| 九九热最新地址| 国产中文字幕精品| 日本一区二区免费高清视频| 日日夜夜综合| 日韩视频免费在线| 国产精品久久久久久免费免熟 | 日韩亚洲欧美综合| 欧美一级片在线视频| 另类成人小视频在线| 亚洲欧美国产不卡| 日本一区二区三区中文字幕| 日韩一区二区三区国产| 97超碰人人草| 伊人夜夜躁av伊人久久| 在线播放av网址| 国产精品v亚洲精品v日韩精品| 114国产精品久久免费观看| av在线免费网站| 欧美成人猛片aaaaaaa| 欧美精品成人久久| www.成人在线| 欧美成人黑人猛交| 日韩欧美高清| 91成人在线看| 嗯啊主人调教在线播放视频| 亚洲精品一二区| 中文字幕在线播放日韩| 亚洲日本va在线观看| 蜜桃色一区二区三区| 99热免费精品在线观看| 日本精品免费| 懂色av色香蕉一区二区蜜桃| 欧美国产视频日韩| 婷婷亚洲一区二区三区| 欧美视频完全免费看| 天天天天天天天天操| aaa国产一区| 少妇一级淫免费放| 国产精品草草| 欧美日韩一区二区视频在线观看 | 日韩精品资源二区在线| 国产情侣在线视频| 欧美国产丝袜视频| 污免费在线观看| 一本久久知道综合久久| 亚洲国产欧美一区二区三区不卡| 久久亚洲精精品中文字幕| 91精品国产高清久久久久久久久| 国产视频第一区| 日韩欧美一级二级| 无码人妻精品一区二| 亚洲精品乱码久久久久| 最近中文字幕免费| 国产成人久久精品77777最新版本 国产成人鲁色资源国产91色综 | 免费成人av电影| 日韩一区二区电影| 午夜久久久久久久久久影院| 一区二区三区鲁丝不卡| 国产一区二区三区四区五区六区| 国产综合久久久久久久久久久久| 两根大肉大捧一进一出好爽视频| 婷婷六月综合| 日韩福利视频| 国产一区二区三区亚洲| 91人成网站www| 日韩高清成人| 久久人人爽人人爽人人片av高清| 午夜视频成人| 亚洲男人天堂2024| 狠狠综合久久av一区二区| 欧美日韩国产一级二级| 欧美精品二区三区| 亚洲一区中文日韩| 美国黄色片视频| 久久精品欧美一区二区三区不卡| 大桥未久恸哭の女教师| 国产综合久久久久久鬼色 | 国产乡下妇女做爰毛片| 国产精品久久久久7777按摩 | 欧美少妇bbw| 欧美日韩国产免费| 超碰在线观看91| 欧美日韩激情美女| 日本视频www| 亚洲一区二区三区激情| 男人av资源站| 国产精品久久久久aaaa| 国产视频123区| 国产欧美综合在线观看第十页| 中文在线一区二区三区| 成人丝袜视频网| 97精品人人妻人人| 国产成人综合在线| 四虎国产精品永久免费观看视频| 久久爱另类一区二区小说| 日本在线观看免费视频| 老牛影视一区二区三区| 精品一区二区中文字幕| 久久成人在线| 少妇性饥渴无码a区免费| 99国产成+人+综合+亚洲欧美| 97中文字幕在线| 欧美精品日本| 人人妻人人澡人人爽欧美一区双 | 天天躁日日躁狠狠躁欧美| 国产美女精品久久久| 国产精品黄网站| 久久免费视频1| 国产精品一区高清| 五月天亚洲综合小说网| 四虎成人精品永久免费av九九| 亚洲一区二区三区在线观看视频 | 久色视频在线播放| 亚洲影视在线| 一区二区成人网| 九九热在线视频观看这里只有精品| 性生活免费在线观看| 精品在线免费视频| 中文在线字幕观看| zzijzzij亚洲日本少妇熟睡| 中文字幕5566| 国产精品系列在线| 色在线观看视频| 亚洲国产欧美日韩另类综合| 日韩欧美中文字幕一区二区| 欧美日韩中国免费专区在线看| 亚洲精品无码久久久久| 欧美高清你懂得| 成人久久久精品国产乱码一区二区| 日韩精品在线观看视频| a天堂中文在线88| 欧美寡妇偷汉性猛交| ****av在线网毛片| 国产成人亚洲综合91| 91精品国产一区二区在线观看| 国产成人精品免费视频大全最热| 日韩电影不卡一区| 亚洲精品一区二区三区四区五区| 91精品一区二区三区综合| www.日本少妇| 麻豆精品一二三| 精品人妻二区中文字幕| 久久精品视频在线免费观看| www.xxxx日本| 色综合久久88色综合天天6| 国产影视一区二区| 亚洲国产精品va| 欧美精品电影| 欧美一级在线亚洲天堂| 免费一区二区三区在线视频| 蜜桃av久久久亚洲精品| 无需播放器亚洲| jizzjizzxxxx| 国产iv一区二区三区| 免费福利视频网站| 亚洲国产日韩一区二区| 亚洲一卡二卡在线观看| 亚洲精品第一国产综合精品| 欧美激情办公室videoshd| 欧美制服第一页| www.成人网| 在线一区高清| 美女久久一区| 逼特逼视频在线观看| 亚洲特黄一级片| 18国产免费视频| 精品五月天久久| 国产福利在线免费观看| 成人性生交大片免费观看嘿嘿视频| 网友自拍一区| 亚洲精品无码国产| 国产电影一区在线| 手机在线中文字幕| 欧美色手机在线观看| 日本午夜在线视频| 久久全国免费视频| 97久久精品| 天天爱天天做天天操| 久久 天天综合| 日韩精品电影一区二区三区| 一本色道亚洲精品aⅴ| 五月婷婷深深爱| 久久久久久久久电影| 精品国产亚洲一区二区在线观看 | 黑人一区二区三区四区五区| 亚洲一区二区三区观看| 日本一区二区成人| 久久久精品毛片| 亚洲色图日韩av| 范冰冰一级做a爰片久久毛片| 国产日韩欧美一区二区| 国一区二区在线观看| 日本wwwxx| 亚洲一区二区三区在线看| 国产成人麻豆精品午夜在线 | 深夜福利影院在线观看| 日韩亚洲欧美一区二区三区| 草莓福利社区在线| 亚洲aa在线观看| 欧美精品福利| 黄色免费看视频| 无吗不卡中文字幕| 台湾av在线二三区观看| 奇米成人av国产一区二区三区| 日本国产精品| 国产精品wwwww| 中文在线资源观看网站视频免费不卡 | 好看的日韩av电影| 久久人妻少妇嫩草av无码专区| 午夜av一区二区| 经典三级在线| 国产美女被下药99| 91精品国偷自产在线电影| 无码人妻丰满熟妇区毛片蜜桃精品| 亚洲综合久久久久| 婷婷五月综合久久中文字幕| 97av在线视频| 激情综合网五月| 国产一区二区在线观看免费视频| 国产精品成人网| 亚洲精品97久久中文字幕| 97久久伊人激情网| 国产剧情在线观看一区| 欧美成年人视频在线观看| 亚洲精品乱码久久久久| 婷婷色在线视频| 国产精品免费在线免费| 欧美黄色一区| 日本丰满少妇裸体自慰| 欧美亚洲一区二区三区四区| 成人高清免费在线| 精选一区二区三区四区五区| 日本不卡一区二区三区高清视频| 一本一本久久a久久| 日韩欧美一二区| 综合久久2023| 日韩人妻一区二区三区蜜桃视频| 99久久综合国产精品| 中文字幕永久在线视频| 久久久久久亚洲| 日韩dvd碟片| 中国免费黄色片| 欧美三级电影网| а_天堂中文在线| 亚洲bbw性色大片| 成人午夜精品在线| 中文字幕码精品视频网站| 欧美高清激情视频| 日韩国产欧美一区二区| 69亚洲乱人伦| 欧美三级韩国三级日本三斤| 国产精品蜜臀| 亚洲精品9999| 久久综合九色综合97婷婷女人| 国产视频在线免费观看| 国产盗摄xxxx视频xxx69| 亚洲小说欧美另类社区| 在线观看免费黄色网址|