激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

node.js|vue.js|jquery|angularjs|React|json|js教程|

服務器之家 - 編程語言 - JavaScript - js教程 - 看完還不會用TypeScript 泛型,你來找我

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

2022-02-22 21:44前端人 js教程

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

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

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

在實際應用中可能會遇到求最小值的問題,比如求數組中的最小值。

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

這樣寫不利于代碼重用,項目較大時,性能較差,同時工作效率也低,所以在 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 ,是指在定義函數、接口或類的時候,不預先指定具體的類型,而是在使用的時候再指定類型的一種。

定義方式:

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

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

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

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 。另外編譯器也會根據傳入的參數自動地幫助我們進行類型推斷,然后把 T 設置為它的類型,所以可以忽略類型的傳入,如:

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

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

2、泛型類型

泛型函數的類型和非泛型函數的類型有什么不同?

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

它們看著很相似,泛型函數類型前面有一個類型參數 。

對于泛型函數類型還有以下特性:

a>、泛型函數類型可以有多個參數

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

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

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

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

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

3、泛型接口

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

let Fn: { <T>(arg: T): T } = fn //替換為 interface FnInter{ <T>(arg: T): T } let Fn: FnInter = fn

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

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

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

我們將整個接口當做泛型參數,就叫做泛型接口。它的優點就是我們能清除知道參數的數據類型,接口內的成員也能知道參數的具體類型。

4、泛型類

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

語法格式為:

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、泛型約束

泛型功能確實挺強大的,但它也不是萬能的。比如:

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

錯誤信息提示:類型“T”上不存在屬性“length”。

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

泛型約束主要是通過接口 + extends 關鍵字來實現約束。

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)); //錯誤提示:類型“number”不滿足約束“ILen”。

使用泛型約束的優點是幫我們自動檢測傳入的值是否符合約束類型的值,不滿足時就會有錯誤提示。

6、泛型參數默認類型

在 typeScript 2.3 以后,可以為泛型中的類型參數指定默認類型,當使用泛型時沒有指定參數類型,并且編輯器從實際參數中也無法推斷出數據類型時,就使用默認類型。

使用簡單:

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

泛型參數的默認類型遵循以下規則:

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

7、泛型條件類型

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

條件類型會以一定條件表達式進行類型關系檢測,從而在兩種類型中選擇其一:

使用語法:

T extends U ? X : Y

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

原文地址:https://www.toutiao.com/a7065251236957667852/

延伸 · 閱讀

精彩推薦
  • js教程如何在JavaScript中使用localStorage詳情

    如何在JavaScript中使用localStorage詳情

    這篇文章主要介紹了如何在JavaScript中使用localStorage,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下...

    碼農翻譯站6242022-01-17
  • js教程javascript類數組的深入理解

    javascript類數組的深入理解

    這篇文章主要給大家介紹了關于javascript類數組的深入理解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋...

    ら淡然如雪11402022-02-15
  • js教程JavaScript代碼實現簡單計算器

    JavaScript代碼實現簡單計算器

    這篇文章主要為大家詳細介紹了JavaScript代碼實現簡單計算器,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    小蟲蟲~4212021-12-21
  • js教程js中延遲加載和預加載的具體使用

    js中延遲加載和預加載的具體使用

    這篇文章主要介紹了js中延遲加載和預加載的具體使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友...

    Yushia5902021-12-31
  • js教程fabric.js實現diy明信片功能

    fabric.js實現diy明信片功能

    這篇文章主要為大家詳細介紹了fabric.js實現diy明信片功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    C49111408810152022-02-19
  • js教程詳解如何愉快的在微信小程序中使用SVG圖標

    詳解如何愉快的在微信小程序中使用SVG圖標

    這篇文章主要介紹了詳解如何愉快的在微信小程序中使用SVG圖標,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要...

    O_o3352022-02-13
  • js教程一份不可多得的 TypeScript 學習筆記

    一份不可多得的 TypeScript 學習筆記

    本篇文章主要介紹TypeScript 中類的定義、類的繼承、類中成員修飾符等內容。...

    前端人4902022-02-21
  • js教程js簡單粗暴的發布訂閱示例代碼

    js簡單粗暴的發布訂閱示例代碼

    這篇文章主要給大家介紹了js簡單粗暴的發布訂閱的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要...

    威威威威vvvv6452022-01-06
主站蜘蛛池模板: china对白普通话xxxx | 一区二区三区国产在线 | 欧美成人午夜影院 | av在线一区二区三区 | 欧美毛片在线观看 | 99在线免费观看视频 | 亚洲无av| 欧美日韩免费在线观看视频 | 亚洲最新无码中文字幕久久 | 日韩a毛片免费观看 | 国产精品久久久久久久久久久久午夜 | 国产亚洲欧美日韩在线观看不卡 | www.99热视频 | 久久草在线视频免费 | 成人小视频免费在线观看 | 毛片视频大全 | 免费看成人av | 国产成人精品免高潮在线观看 | 亚洲精品久久久久久 | 91网页视频入口在线观看 | 神马福利网 | 国产精品九九久久一区hh | av手机免费在线观看 | 在线观看免费精品 | 欧美日韩在线视频一区 | 久久久国产精品视频 | 午夜视频中文字幕 | 久久伊| 播色网| 中文字幕在线视频日本 | 欧美一级黄 | 久久草在线观看视频 | 国产精品久久久久久久久久久天堂 | 久久久久一区二区三区 | 久久人添人人爽人人爽人人片av | 日韩黄色成人 | 538在线精品| 色悠悠久久久久 | 精品久久久久久成人av | 蜜桃视频在线播放 | 黄色大片在线免费看 |