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

看完還不會用TypeScript 泛型,你來找我

開發(fā) 前端
本篇文章主要介紹 typeScript 中新增的泛型概念、泛型使用、泛型與接口結(jié)合等內(nèi)容。

本篇文章主要介紹 typeScript 中新增的泛型概念、泛型使用、泛型與接口結(jié)合等內(nèi)容。

在實(shí)際應(yīng)用中可能會遇到求最小值的問題,比如求數(shù)組中的最小值。

在 ts 中的就需要寫兩種方式,一種針對 number,另外一種針對字符串。

這樣寫不利于代碼重用,項(xiàng)目較大時(shí),性能較差,同時(shí)工作效率也低,所以在 ts 中引入了泛型概念。

function getMin1(arr:number[]):number {
let min = arr[0]
for (var i = 1; i < arr.length; i++){
if (min > arr[i]) {
min = arr[i]
}
}
return min
}
console.log(getMin1([1, 2, 3, 4]));
function getMin2(arr:string[]):string {
let min = arr[0]
for (var i = 1; i < arr.length; i++){
if (min > arr[i]) {
min = arr[i]
}
}
return min
}
console.log(getMin2(['a', 'b', 'c']));

1、泛型是啥?

泛型英文是 generics ,是指在定義函數(shù)、接口或類的時(shí)候,不預(yù)先指定具體的類型,而是在使用的時(shí)候再指定類型的一種。

定義方式:

function fnName<T>(arg:T,...):T{
return ...
}

泛型變量通常用 T 來表示,T可以表示任何類型。

所以呢,我們可以將上述實(shí)例修改成以下代碼:

function getMin<T>(arr: T[]): T{
let min = arr[0]
for (var i = 1; i < arr.length; i++){
if (min > arr[i]) {
min = arr[i]
}
}
return min
}
getMin<number>([1, 2, 3, 4])
getMin<string>(['a', 'b', 'c', 'd'])

上述代碼中,T 的主要作用就是幫助我們來捕獲用戶傳入的類型,比如 :number 或 string 。另外編譯器也會根據(jù)傳入的參數(shù)自動地幫助我們進(jìn)行類型推斷,然后把 T 設(shè)置為它的類型,所以可以忽略類型的傳入,如:

getMin([1, 2, 3, 4])
getMin(['a', 'b', 'c', 'd'])

在一些復(fù)雜的情況下,為了防止編譯器自動推斷類似失敗,盡可能地將類型傳入,防止出錯(cuò)。

2、泛型類型

泛型函數(shù)的類型和非泛型函數(shù)的類型有什么不同?

它們看著很相似,泛型函數(shù)類型前面有一個(gè)類型參數(shù) 。

對于泛型函數(shù)類型還有以下特性:

a>、泛型函數(shù)類型可以有多個(gè)參數(shù)

function fn<T, U>(arg1: T, arg2: U) {
return arg1
}

b>、泛型函數(shù)可以使用不同的泛型參數(shù)名

function fn<T>(arg1: T) {
return arg1
}
let Fn: <M>(arg1: M) => M = fn

c>、可以使用帶有對象字面量的方式定義泛型函數(shù)

function fn<T>(arg1: T) {
return arg1
}
let Fn: {<T>(arg: T): T} = fn

3、泛型接口

在使用對象字面量的方式定義泛型函數(shù)時(shí),對象的形式可以替換成接口的形式,改為:

let Fn: { <T>(arg: T): T } = fn

//替換為

interface FnInter{
<T>(arg: T): T
}
let Fn: FnInter = fn

這種方式存在問題:函數(shù)對數(shù)據(jù)類型一無所知,無法使用某個(gè)數(shù)據(jù)類型進(jìn)行操作。所以需要改良下,將類型作為參數(shù)傳入,如:

interface FnInter<T>{
(arg:T): T
}
let Fn: FnInter<string> = fn

這樣我們就能清楚地知道使用的具體是那個(gè)泛型類型。

我們將整個(gè)接口當(dāng)做泛型參數(shù),就叫做泛型接口。它的優(yōu)點(diǎn)就是我們能清除知道參數(shù)的數(shù)據(jù)類型,接口內(nèi)的成員也能知道參數(shù)的具體類型。

4、泛型類

除了有泛型接口之外,還有接口類。泛型類與泛型函數(shù)差不多。

語法格式為:

class 名稱<T>{}
new 類名<類型>()
class GetMin<T>{
arr: T[] = []
add(ele:T) {
this.arr.push(ele)
}
getMin(): T{
var min = this.arr[0]
for (var i = 0; i < this.arr.length; i++){
if (min > this.arr[i]) {
min = this.arr[i]
}
}
return min
}
}
let gMin1 = new GetMin<number>()
gMin1.add(1)
gMin1.add(5)
console.log(gMin1.getMin());//1

let gMin2 = new GetMin<string>()
gMin2.add('a')
gMin2.add('b')
console.log(gMin2.getMin());//2

5、泛型約束

泛型功能確實(shí)挺強(qiáng)大的,但它也不是萬能的。比如:

function getLength<T>(val: T): number {
return val.length;
}

錯(cuò)誤信息提示:類型“T”上不存在屬性“l(fā)ength”。

原因是只有字符串、數(shù)組才有 length 屬性,對于數(shù)字、對象沒有 length 屬性,所以報(bào)錯(cuò)了。解決辦法是要保證傳入的數(shù)據(jù)類型有 length 屬性,所以需要使用泛型約束。

泛型約束主要是通過接口 + extends 關(guān)鍵字來實(shí)現(xiàn)約束。

interface ILen{
length:number
}
function getLength<T extends ILen>(val: T): number {
return val.length;
}
console.log(getLength<string>("abcd"));
console.log(getLength<number>(1)); //錯(cuò)誤提示:類型“number”不滿足約束“ILen”。

使用泛型約束的優(yōu)點(diǎn)是幫我們自動檢測傳入的值是否符合約束類型的值,不滿足時(shí)就會有錯(cuò)誤提示。

6、泛型參數(shù)默認(rèn)類型

在 typeScript 2.3 以后,可以為泛型中的類型參數(shù)指定默認(rèn)類型,當(dāng)使用泛型時(shí)沒有指定參數(shù)類型,并且編輯器從實(shí)際參數(shù)中也無法推斷出數(shù)據(jù)類型時(shí),就使用默認(rèn)類型。

使用簡單:

interface P<T = string>{
name:T
}
let p1: P = { name: "小姐姐" }
let p2: P<number> = { name: 18 }

泛型參數(shù)的默認(rèn)類型遵循以下規(guī)則:

  • 有默認(rèn)類型的類型參數(shù)被認(rèn)為是可選的。
  • 必選的類型參數(shù)不能在可選的類型參數(shù)后。
  • 如果類型參數(shù)有約束,類型參數(shù)的默認(rèn)類型必須滿足這個(gè)約束。
  • 當(dāng)指定類型實(shí)參時(shí),你只需要指定必選類型參數(shù)的類型實(shí)參。 未指定的類型參數(shù)會被解析為它們的默認(rèn)類型。
  • 如果指定了默認(rèn)類型,且類型推斷無法選擇一個(gè)候選類型,那么將使用默認(rèn)類型作為推斷結(jié)果。
  • 一個(gè)被現(xiàn)有類或接口合并的類或者接口的聲明可以為現(xiàn)有類型參數(shù)引入默認(rèn)類型。
  • 一個(gè)被現(xiàn)有類或接口合并的類或者接口的聲明可以引入新的類型參數(shù),只要它指定了默認(rèn)類型。

7、泛型條件類型

在 typeScript 2.8 中,引入了條件類型,我們可以根據(jù)某些條件得到不同的類型,此處的條件是類型兼容性約束。

條件類型會以一定條件表達(dá)式進(jìn)行類型關(guān)系檢測,從而在兩種類型中選擇其一:

使用語法:

T extends U ? X : Y

以上表達(dá)式的意思是:若 T 能夠賦值給 U,那么類型是 X,否則為 Y。

責(zé)任編輯:姜華 來源: 今日頭條
相關(guān)推薦

2021-03-16 15:12:57

CompletableFuture機(jī)制java

2020-05-14 08:59:28

API網(wǎng)關(guān)性能

2024-09-09 08:36:36

Java操作遠(yuǎn)程服務(wù)器

2024-08-12 12:25:25

SpringMVC開發(fā)

2023-11-08 08:27:30

泛型Java

2021-05-10 08:34:37

USB接口USB網(wǎng)絡(luò)設(shè)備

2022-01-03 18:07:56

泛型場景demo

2020-10-09 09:49:18

HTTPS網(wǎng)絡(luò) HTTP

2020-09-01 14:17:03

WindowsDefender微軟

2019-08-27 10:55:59

MySQLJOINSQLite

2020-10-21 10:02:16

架構(gòu)運(yùn)維技術(shù)

2018-09-13 10:40:40

Linux命令find

2020-09-27 06:50:56

Java互聯(lián)網(wǎng)注解

2021-10-17 13:10:56

函數(shù)TypeScript泛型

2019-09-03 09:30:46

ss 命令SocketLinux

2020-09-15 09:50:47

程序員技能開發(fā)者

2020-12-18 09:45:33

DockerLinux命令

2022-08-01 08:17:46

mysqlwindows系統(tǒng)

2020-08-26 14:40:38

explainMySQL數(shù)據(jù)庫

2024-04-23 08:23:36

TypeScript泛型Generics
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 国产精品无码久久久久 | 精品国产免费人成在线观看 | 自拍偷拍亚洲欧美 | 久久久精品国产 | 国产成人午夜精品影院游乐网 | 在线婷婷 | 亚洲黄色一区二区三区 | 99热在线播放 | 精品在线99 | 激情网站在线观看 | 91看片在线 | 国产一区二区三区四区 | 国产98色在线 | 日韩 | 国产精品久久久久久久午夜片 | 激情欧美一区二区三区 | 亚洲精品视频在线 | 黄色成人在线网站 | 日日天天 | 天天插天天搞 | 午夜性视频 | 高清成人av| 久久久久一区二区三区 | 爱爱视频网| 欧美精品一区二区三区四区 在线 | 亚洲成人综合在线 | 国产在线1区 | 亚洲成人精品久久久 | 亚洲 欧美 另类 综合 偷拍 | 求个av网址 | 日本一区二区高清不卡 | 国产一区二区三区久久久久久久久 | 在线播放国产一区二区三区 | 一区二区三区四区视频 | 欧美国产日韩在线 | 成人在线免费 | 日本黄色短片 | 狠狠的日| 久久亚洲一区 | 国产免费一区 | 97精品超碰一区二区三区 | 亚洲在线看 |