成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

泛型,很多人因它放棄學習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內置聯合類型

2021-01-30 11:42:53

迭代器代碼元素

2024-09-12 08:32:42

2021-02-22 13:14:00

計算機編程技術

2018-02-13 14:48:17

戴爾

2022-02-06 00:07:19

互聯網失業職業

2019-08-21 08:24:34

技術過濾器代碼

2021-06-24 09:08:34

Java代碼泛型

2022-07-06 10:33:39

技術債務CIO

2017-12-13 15:57:12

2021-12-14 07:40:08

前端

2021-01-15 05:39:13

HashMapHashTableTreeMap

2020-06-29 08:28:36

v-for 解構函數

2014-05-09 15:29:21

2020-11-16 11:24:00

Spring AOP數據庫

2021-09-21 10:33:56

人工智能科學技術

2022-01-05 23:34:02

顯示器濾藍光LED

2019-08-08 16:00:08

HTTPGETPOST
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产日韩欧美一区 | 2一3sex性hd | 国产精品久久99 | 色橹橹欧美在线观看视频高清 | 99久久精品免费看国产四区 | 日韩在线视频一区二区三区 | 亚洲国产精品久久久久秋霞不卡 | 一级片免费视频 | 在线播放日韩 | 作爱视频免费观看 | 色婷婷在线视频 | 伊人春色成人网 | 亚洲一区二区三区四区五区中文 | 日本免费在线观看视频 | 国产第1页 | 操久久 | 蜜臀av日日欢夜夜爽一区 | 91嫩草精品| 日韩欧美一区二区三区四区 | 久久精品视频在线播放 | 国产精品国产三级国产a | 日韩有码一区 | 日韩国产黄色片 | 国产精品网页 | 日韩在线| 一级片免费网站 | 91精品国产一区二区三区 | www.中文字幕.com | 福利av在线 | 国产精品视频网 | 欧美极品一区二区 | 欧美在线观看一区 | 亚洲va国产日韩欧美精品色婷婷 | 天堂资源最新在线 | 久久综合一区二区三区 | 久久久精品| 欧洲一级黄 | 91免费福利视频 | 久久高清| 国产精品久久国产精品 | 国产一区二区三区在线观看免费 |