最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

TypeScript 泛型的使用

 更新時(shí)間:2021年12月10日 09:27:36   作者:一碗周  
這篇文章主要介紹了TypeScript 泛型的使用,在JavaScript中,封裝一個(gè)API可以具有多種用途,因?yàn)槠鋵?shí)弱類(lèi)型語(yǔ)言,但是就因?yàn)槭侨躅?lèi)型可以最終得到的結(jié)果并不是我們想要的,下面我們就來(lái)看看具體TypeScript 泛型的使用吧

前言:

JavaScript中,封裝一個(gè)API可以具有多種用途,因?yàn)槠鋵?shí)弱類(lèi)型語(yǔ)言,但是就因?yàn)槭侨躅?lèi)型可以最終得到的結(jié)果并不是我們想要的。

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

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

1.簡(jiǎn)單的使用

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

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

定義泛型是通過(guò)<>對(duì)尖括號(hào)來(lái)定義,我們?cè)诙xjoin函數(shù)的時(shí)候,并不知道可以接受那些類(lèi)型,但是可以明確的是兩個(gè)類(lèi)型是必須一樣的,如果想要滿足這樣的需求,不用泛型的話解決起來(lái)是沒(méi)有這么簡(jiǎn)單的。

在調(diào)用函數(shù)的時(shí)候,這里使用了兩種方式,一種是直接指定類(lèi)型為string類(lèi)型;另一種是通過(guò)類(lèi)型推導(dǎo)的方式,編輯器會(huì)根據(jù)傳入的參數(shù)自動(dòng)幫助我們確定類(lèi)型。

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

在定義一個(gè)函數(shù)時(shí),我們可以使用多個(gè)泛型,而且返回值類(lèi)型也可以通過(guò)泛型指定,只要在數(shù)量上和使用方式上能對(duì)應(yīng)就可以。

示例代碼如下

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

3.在類(lèi)中使用泛型

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

示例代碼如下:

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

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

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

使用extends可以達(dá)到一個(gè)泛型約束 的作用,就上面那個(gè)代碼來(lái)說(shuō),我們必須約束傳入的值必有具有一個(gè)name屬性,否則就會(huì)拋出異常。

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

假如有如下需求,我們定義一個(gè)類(lèi),在類(lèi)中一個(gè)私有對(duì)象,該對(duì)象中包含一些屬性;然后定義一個(gè)方法,通過(guò)key來(lái)獲取其對(duì)應(yīng)的值。

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

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

上面的代碼,如果我們調(diào)用示實(shí)例對(duì)象中的getInfo()方法時(shí),傳入一個(gè)沒(méi)有的屬性,會(huì)得到一個(gè)undefined。調(diào)用一個(gè)方法返回一個(gè)undefined時(shí),這并不是TypeScript中的作風(fēng)。

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

示例代碼如下:

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

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

示例代碼如下:

class Me {
  constructor(private info: Person) {}
  // 該寫(xiě)法與如下寫(xiě)法是一樣的
  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',
})
// 調(diào)用 me.getInfo() 如果傳遞一個(gè)未知的屬性則會(huì)編譯錯(cuò)誤
me.getInfo('myName') // error : 類(lèi)型“"myName"”的參數(shù)不能賦給類(lèi)型“keyof Person”的參數(shù)。

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

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

相關(guān)文章

  • D3.js實(shí)現(xiàn)拓?fù)鋱D的示例代碼

    D3.js實(shí)現(xiàn)拓?fù)鋱D的示例代碼

    本篇文章主要介紹了D3.js實(shí)現(xiàn)拓?fù)鋱D的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-06-06
  • 使用JavaScript實(shí)現(xiàn)獲取頁(yè)面上所有的img并保存本地

    使用JavaScript實(shí)現(xiàn)獲取頁(yè)面上所有的img并保存本地

    這篇文章主要為大家詳細(xì)介紹了如何使用JavaScript實(shí)現(xiàn)獲取頁(yè)面上所有的img并保存到本地,文中的示例代碼講解詳細(xì),有需要的小伙伴可以了解下
    2024-12-12
  • 利用JS實(shí)現(xiàn)簡(jiǎn)單的日期選擇插件

    利用JS實(shí)現(xiàn)簡(jiǎn)單的日期選擇插件

    這篇文章主要介紹了利用JS實(shí)現(xiàn)簡(jiǎn)單的日期選擇插件,文中實(shí)現(xiàn)兩種效果的日期選擇,一種是默認(rèn)參數(shù),點(diǎn)擊日期后直接選擇該日期,另一種是顯示按鈕來(lái)設(shè)置時(shí)間,有需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-01-01
  • js當(dāng)前頁(yè)面登錄注冊(cè)框,固定div,底層陰影的實(shí)例代碼

    js當(dāng)前頁(yè)面登錄注冊(cè)框,固定div,底層陰影的實(shí)例代碼

    下面小編就為大家?guī)?lái)一篇js當(dāng)前頁(yè)面登錄注冊(cè)框,固定div,底層陰影的實(shí)例代碼。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-10-10
  • 原創(chuàng)javascript小游戲?qū)崿F(xiàn)代碼

    原創(chuàng)javascript小游戲?qū)崿F(xiàn)代碼

    javascript小游戲?qū)崿F(xiàn)代碼,喜歡用javascript實(shí)現(xiàn)游戲效果代碼的朋友可以參考下。
    2010-08-08
  • JavaScript事件的委托(代理)的用法示例詳解

    JavaScript事件的委托(代理)的用法示例詳解

    事件委托,也叫事件代理,是JavaScript中綁定事件的一種常用技巧。就是將原本需要綁定在子元素的響應(yīng)事件委托給父元素或更外層元素,讓外層元素?fù)?dān)當(dāng)事件監(jiān)聽(tīng)的職務(wù)。本文將詳細(xì)為大家介紹JavaScript事件委托的用法,需要的可以參考一下
    2022-01-01
  • 頁(yè)面右下角彈出提示框示例代碼js版

    頁(yè)面右下角彈出提示框示例代碼js版

    右下角彈出提示框想必大家不會(huì)陌生吧,本文簡(jiǎn)單的為大家實(shí)現(xiàn)一個(gè),具體代碼如下,有需求的朋友可以參考下
    2013-08-08
  • Bootstrap基本插件學(xué)習(xí)筆記之按鈕(21)

    Bootstrap基本插件學(xué)習(xí)筆記之按鈕(21)

    這篇文章主要為大家詳細(xì)介紹了Bootstrap基本插件學(xué)習(xí)筆記之按鈕的相關(guān)資料,實(shí)現(xiàn)按鈕狀態(tài)控制等形式的交互,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • 詳解javascript事件綁定使用方法

    詳解javascript事件綁定使用方法

    這篇文章主要為大家詳細(xì)介紹了javascript事件綁定使用方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • 純js實(shí)現(xiàn)瀑布流展現(xiàn)照片(自動(dòng)適應(yīng)窗口大小)

    純js實(shí)現(xiàn)瀑布流展現(xiàn)照片(自動(dòng)適應(yīng)窗口大小)

    用瀑布流來(lái)展現(xiàn)照片再好不過(guò)了,我的思路大概是一張一張的圖片插入,當(dāng)這一行的圖片保持長(zhǎng)寬比例不變并且高度低于250時(shí)就完成一個(gè)了循環(huán),即這一行插入進(jìn)去了
    2013-04-04

最新評(píng)論

黑龙江省| 峨眉山市| 阿巴嘎旗| 门源| 宁陕县| 蓬安县| 陇川县| 梁平县| 南丹县| 南木林县| 海城市| 榆社县| 台东县| 麻江县| 南充市| 寿宁县| 上犹县| 农安县| 大化| 镇康县| 阳东县| 新乡市| 太仆寺旗| 海晏县| 潢川县| 图们市| 深州市| 宁蒗| 万载县| 海阳市| 长岭县| 聂荣县| 岢岚县| 小金县| 博白县| 大城县| 封开县| 玛曲县| 姜堰市| 云梦县| 西贡区|