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

面試官:說說你對 TypeScript 中泛型的理解?應用場景?

開發 前端
泛型允許我們在強類型程序設計語言中編寫代碼時使用一些以后才指定的類型,在實例化時作為參數指明這些類型 在typescript中,定義函數,接口或者類的時候,不預先定義好具體的類型,而在使用的時候在指定類型的一種特性。

[[422524]]

本文轉載自微信公眾號「JS每日一題」,作者灰灰。轉載本文請聯系JS每日一題公眾號。

一、是什么

泛型程序設計(generic programming)是程序設計語言的一種風格或范式

泛型允許我們在強類型程序設計語言中編寫代碼時使用一些以后才指定的類型,在實例化時作為參數指明這些類型 在typescript中,定義函數,接口或者類的時候,不預先定義好具體的類型,而在使用的時候在指定類型的一種特性

假設我們用一個函數,它可接受一個 number 參數并返回一個number 參數,如下寫法:

  1. function returnItem (para: number): number { 
  2.     return para 

如果我們打算接受一個 string 類型,然后再返回 string類型,則如下寫法:

  1. function returnItem (para: string): string { 
  2.     return para 

上述兩種編寫方式,存在一個最明顯的問題在于,代碼重復度比較高

雖然可以使用 any類型去替代,但這也并不是很好的方案,因為我們的目的是接收什么類型的參數返回什么類型的參數,即在運行時傳入參數我們才能確定類型

這種情況就可以使用泛型,如下所示:

  1. function returnItem<T>(para: T): T { 
  2.     return para 

可以看到,泛型給予開發者創造靈活、可重用代碼的能力

二、使用方式

泛型通過<>的形式進行表述,可以聲明:

  • 函數
  • 接口

函數聲明

聲明函數的形式如下:

  1. function returnItem<T>(para: T): T { 
  2.     return para 

定義泛型的時候,可以一次定義「多個類型參數」,比如我們可以同時定義泛型 T 和 泛型 U:

  1. function swap<T, U>(tuple: [T, U]): [U, T] { 
  2.     return [tuple[1], tuple[0]]; 
  3.  
  4. swap([7, 'seven']); // ['seven', 7] 

接口聲明

聲明接口的形式如下:

  1. interface ReturnItemFn<T> { 
  2.     (para: T): T 

那么當我們想傳入一個number作為參數的時候,就可以這樣聲明函數:

  1. const returnItem: ReturnItemFn<number> = para => para 

類聲明

使用泛型聲明類的時候,既可以作用于類本身,也可以作用于類的成員函數

下面簡單實現一個元素同類型的棧結構,如下所示:

  1. class Stack<T> { 
  2.     private arr: T[] = [] 
  3.  
  4.     public push(item: T) { 
  5.         this.arr.push(item) 
  6.     } 
  7.  
  8.     public pop() { 
  9.         this.arr.pop() 
  10.     } 

使用方式如下:

  1. const stack = new Stacn() 

如果上述只能傳遞 string 和 number 類型,這時候就可以使用 的方式猜實現「約束泛型」,如下所示:

除了上述的形式,泛型更高級的使用如下:

例如要設計一個函數,這個函數接受兩個參數,一個參數為對象,另一個參數為對象上的屬性,我們通過這兩個參數返回這個屬性的值

這時候就設計到泛型的索引類型和約束類型共同實現

索引類型、約束類型

索引類型 keyof T 把傳入的對象的屬性類型取出生成一個聯合類型,這里的泛型 U 被約束在這個聯合類型中,如下所示:

  1. function getValue<T extends object, U extends keyof T>(obj: T, key: U) { 
  2.   return obj[key] // ok 

上述為什么需要使用泛型約束,而不是直接定義第一個參數為 object類型,是因為默認情況 object 指的是{},而我們接收的對象是各種各樣的,一個泛型來表示傳入的對象類型,比如 T extends object

使用如下圖所示:

多類型約束

例如如下需要實現兩個接口的類型約束:

  1. interface FirstInterface { 
  2.   doSomething(): number 
  3.  
  4. interface SecondInterface { 
  5.   doSomethingElse(): string 

可以創建一個接口繼承上述兩個接口,如下:

  1. interface ChildInterface extends FirstInterface, SecondInterface { 
  2.  

正確使用如下:

  1. class Demo<T extends ChildInterface> { 
  2.   private genericProperty: T 
  3.  
  4.   constructor(genericProperty: T) { 
  5.     this.genericProperty = genericProperty 
  6.   } 
  7.   useT() { 
  8.     this.genericProperty.doSomething() 
  9.     this.genericProperty.doSomethingElse() 
  10.   } 

通過泛型約束就可以達到多類型約束的目的

三、應用場景

通過上面初步的了解,后述在編寫 typescript 的時候,定義函數,接口或者類的時候,不預先定義好具體的類型,而在使用的時候在指定類型的一種特性的時候,這種情況下就可以使用泛型

靈活的使用泛型定義類型,是掌握typescript 必經之路

參考文獻

 

https://www.tslang.cn/docs/handbook/generics.html

 

責任編輯:武曉燕 來源: JS每日一題
相關推薦

2021-09-06 10:51:27

TypeScriptJavaScript

2021-09-16 07:52:18

算法應用場景

2021-09-10 06:50:03

TypeScript裝飾器應用

2021-11-09 08:51:13

模式命令面試

2021-11-05 07:47:56

代理模式對象

2021-11-10 07:47:49

組合模式場景

2021-08-16 08:33:26

git

2021-11-03 14:10:28

工廠模式場景

2021-09-28 07:12:09

測試路徑

2021-11-22 23:50:59

責任鏈模式場景

2021-11-11 16:37:05

模板模式方法

2021-09-29 07:24:20

場景數據

2021-10-13 18:01:33

快速排序場景

2021-10-08 09:59:32

冒泡排序場景

2021-10-09 10:25:41

排序應用場景

2021-11-04 06:58:32

策略模式面試

2021-05-31 10:35:34

TCPWebSocket協議

2021-06-01 08:25:06

Node.jsJavaScript運行

2021-10-18 07:51:39

回溯算法面試

2021-10-11 09:38:41

開源
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 精品一区二区免费视频 | 国产综合视频 | 99精品一级欧美片免费播放 | 国产精品区二区三区日本 | 日本福利一区 | 久久久久久综合 | 欧美日日 | 久久国品片 | 丁香婷婷综合激情五月色 | 午夜激情小视频 | 成人久久网 | 日韩三级精品 | 久久成人精品一区二区三区 | 久久国产欧美日韩精品 | 国产成人精品免费视频大全最热 | 成人三级视频 | 欧美一级片a | 欧洲一区二区三区 | 一区二区成人 | 天天干天天插 | 91免费在线视频 | 麻豆亚洲 | 成人综合伊人 | 亚洲综合色丁香婷婷六月图片 | 美女一级黄 | 欧美日本亚洲 | 欧美精品在线免费观看 | 精品一区二区久久久久久久网站 | 久久久99精品免费观看 | 国产一区黄色 | 午夜欧美| 亚洲理论在线观看电影 | 国产视频中文字幕 | 成人一区二区三区 | 国产精品一区2区 | 日韩视频中文字幕 | 免费三级黄 | 中文字幕一级 | 亚洲高清在线观看 | 天天拍天天插 | 精品在线观看入口 |