欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

TypeScript 泛型的使用

 更新時間:2021年12月10日 09:27:36   作者:一碗周  
這篇文章主要介紹了TypeScript 泛型的使用,在JavaScript中,封裝一個API可以具有多種用途,因為其實弱類型語言,但是就因為是弱類型可以最終得到的結果并不是我們想要的,下面我們就來看看具體TypeScript 泛型的使用吧

前言:

JavaScript中,封裝一個API可以具有多種用途,因為其實弱類型語言,但是就因為是弱類型可以最終得到的結果并不是我們想要的。

TypeScript的出現(xiàn)正好中解決了這個問題,但是考慮到API的復用時,TypeScript又顯得不是這么的靈活。這個時候可以使用any類型來解決不靈活的問題,但是又回到JavaScript中的問題,得到最終的結果可能不是預期的那個樣子。

為了解決這種情況,TypeScript推出了泛型 的概念,使用泛型可以在定義函數(shù)、接口或類的時候,不預先指定具體的類型,而在使用的時候再指定類型,這樣做的目的是為了更大程度的來復用我們的代碼。

1.簡單的使用

現(xiàn)在我們要定義一個join函數(shù),該函數(shù)的功能主要是接受兩個類型一樣的值,返回兩個參數(shù)拼接后的值。示例代碼如下:

// 所謂的泛型,通俗一點的解釋就是泛指的類型
// 定義一個join函數(shù),接受兩個一樣類型的參數(shù),并將兩個參數(shù)拼接后返回。
function join<T>(first: T, second: T) {
  return `${first}${second}`
}
// 這里明確 T 為 string 類型
join<string>('第一', '第二') // 第一第二
// 這里通過類型推導的方式,編譯器會根據(jù)傳入的參數(shù)自動推斷出類型
join(1, 2) // 12

定義泛型是通過<>對尖括號來定義,我們在定義join函數(shù)的時候,并不知道可以接受那些類型,但是可以明確的是兩個類型是必須一樣的,如果想要滿足這樣的需求,不用泛型的話解決起來是沒有這么簡單的。

在調用函數(shù)的時候,這里使用了兩種方式,一種是直接指定類型為string類型;另一種是通過類型推導的方式,編輯器會根據(jù)傳入的參數(shù)自動幫助我們確定類型。

2.在函數(shù)中使用泛型

在定義一個函數(shù)時,我們可以使用多個泛型,而且返回值類型也可以通過泛型指定,只要在數(shù)量上和使用方式上能對應就可以。

示例代碼如下

function identity<T, Y, P>(first: T, second: Y, third: P): Y {
  return second
}
// 指定類型
identity<boolean, string, number>(true, '字符串', 123) // 字符串
// 類型推斷
identity('string', 123, true) // true

3.在類中使用泛型

我們不僅可以在函數(shù)中使用泛型,還可以在類中使用泛型。

示例代碼如下:

class DataManager<T> {
  // 定義一個類,該類中具有一個T類型的私有數(shù)組
  constructor(private data: T[]) {}
  // 根據(jù)索引說數(shù)組中的值
  getItem(index: number): T {
    return this.data[index]
  }
}
const data = new DataManager(['一碗周'])
data.getItem(0) // 一碗周

而且泛型還可以繼承與于某個接口,示例代碼如下:

interface Item {
  name: string
}
class DataManager<T extends Item> {
  // 定義一個類,該類中具有一個T類型的私有數(shù)組
  constructor(private data: T[]) {}
  // 根據(jù)索引說數(shù)組中的值
  getItem(index: number): string {
    return this.data[index].name
  }
}
const data = new DataManager([{ name: '一碗周' }])
data.getItem(0) // 一碗周

使用extends可以達到一個泛型約束 的作用,就上面那個代碼來說,我們必須約束傳入的值必有具有一個name屬性,否則就會拋出異常。

4.在泛型約束中使用類型參數(shù)

假如有如下需求,我們定義一個類,在類中一個私有對象,該對象中包含一些屬性;然后定義一個方法,通過key來獲取其對應的值。

實現(xiàn)代碼如下:

// 定義一個接口
interface Person {
  name: string
  age: number
  hobby: string
}
// 定義一個類
class Me {
  constructor(private info: Person) {}
  getInfo(key: string) {
    return this.info[key]
  }
}
const me = new Me({
  name: '一碗周',
  age: 18,
  hobby: 'coding',
})
// 調用 me.getInfo() 可能會得到一個 undefined 如下示例
me.getInfo('myName') // undefined

上面的代碼,如果我們調用示實例對象中的getInfo()方法時,傳入一個沒有的屬性,會得到一個undefined。調用一個方法返回一個undefined時,這并不是TypeScript中的作風。

解決該問題可以通過keyof操作符,該關鍵字可以通過該操作符可以用于獲取某種類型的所有鍵,其返回類型是聯(lián)合類型。

示例代碼如下:

type myPerson = keyof Person // 'name' | 'age' | 'hobby'

那現(xiàn)在就可以通過該操作符解決上面出現(xiàn)的那個問題

示例代碼如下:

class Me {
  constructor(private info: Person) {}
  // 該寫法與如下寫法是一樣的
  getInfo<T extends keyof Person>(key: T): Person[T] {
    return this.info[key]
  }
  // getInfo<T extends 'name' | 'age' | 'hobby'>(key: T): Person[T] {
  //     return this.info[key]
  // }
}
const me = new Me({
  name: '一碗周',
  age: 18,
  hobby: 'coding',
})
// 調用 me.getInfo() 如果傳遞一個未知的屬性則會編譯錯誤
me.getInfo('myName') // error : 類型“"myName"”的參數(shù)不能賦給類型“keyof Person”的參數(shù)。

現(xiàn)在我們只要訪問對象中不具有的屬性編譯則會異常。

到此這篇關于TypeScript 泛型的使用的文章就介紹到這了,更多相關TypeScript 泛型內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

  • 實用javaScript技術-屏蔽類

    實用javaScript技術-屏蔽類

    實用javaScript技術-屏蔽類...
    2006-08-08
  • 簡單談談js的數(shù)據(jù)類型

    簡單談談js的數(shù)據(jù)類型

    下面小編就為大家?guī)硪黄唵握務刯s的數(shù)據(jù)類型。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • JS把內容動態(tài)插入到DIV的實現(xiàn)方法

    JS把內容動態(tài)插入到DIV的實現(xiàn)方法

    下面小編就為大家?guī)硪黄狫S把內容動態(tài)插入到DIV的實現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-07-07
  • Ionic如何創(chuàng)建APP項目

    Ionic如何創(chuàng)建APP項目

    這篇文章主要介紹Ionic如何創(chuàng)建APP項目的相關資料,非常不錯具有參考借鑒價值,需要的朋友可以參考下
    2016-06-06
  • 小程序原生實現(xiàn)左滑抽屜菜單

    小程序原生實現(xiàn)左滑抽屜菜單

    在移動端,側滑菜單是一個很常用的組件,本文就詳細的介紹小程序原生實現(xiàn)左滑抽屜菜單,具有一定的參考價值,感興趣的可以了解一下
    2021-07-07
  • JavaScript編程設計模式之觀察者模式(Observer Pattern)實例詳解

    JavaScript編程設計模式之觀察者模式(Observer Pattern)實例詳解

    這篇文章主要介紹了JavaScript編程設計模式之觀察者模式(Observer Pattern),簡單說明了觀察者模式的概念、原理并結合實例形式詳細給出了觀察者模式的相關實現(xiàn)與使用技巧,需要的朋友可以參考下
    2017-10-10
  • JavaScript實現(xiàn)圖片自動加載的瀑布流效果

    JavaScript實現(xiàn)圖片自動加載的瀑布流效果

    這篇文章主要介紹了JavaScript實現(xiàn)圖片自動加載的瀑布流效果的相關資料,需要的朋友可以參考下
    2016-04-04
  • JavaScript布爾運算符原理使用解析

    JavaScript布爾運算符原理使用解析

    這篇文章主要介紹了JavaScript布爾運算符原理使用解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-05-05
  • js+html5實現(xiàn)半透明遮罩層彈框效果

    js+html5實現(xiàn)半透明遮罩層彈框效果

    這篇文章主要為大家詳細介紹了js+html5實現(xiàn)半透明遮罩層彈框效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • 最新評論