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

TypeScript泛型約束條件示例詳解

 更新時(shí)間:2022年04月02日 11:10:44   作者:小周的前端前進(jìn)之路  
有了泛型之后一個(gè)函數(shù)或容器類能處理的類型一下子擴(kuò)到了無限大,似乎有點(diǎn)失控的感覺,所以這里又產(chǎn)生了一個(gè)約束的概念,下面這篇文章主要給大家介紹了關(guān)于TypeScript泛型約束條件的相關(guān)資料,需要的朋友可以參考下

什么是泛型

兩個(gè)值之間存在的對應(yīng)關(guān)系,就可以用泛型來解決

泛型的應(yīng)用場景

當(dāng)一個(gè)函數(shù)的返回值的類型需要與此函數(shù)的參數(shù)類型想關(guān)聯(lián)的時(shí)候,就需要使用泛型

例如

//約定此函數(shù)調(diào)用時(shí)必須傳入一個(gè)數(shù)組,并返回?cái)?shù)組第一項(xiàng)
function arrFn <T> (arr: T[]) :T|undefined {
        return arr[0]
}

  const n = arrFn([1,2])      //number類型
  const s = arrFn(['a','b'])  //string類型
  const u = arrFn([])          //undefined類型
  
  //也可以進(jìn)行指定類型
  arrFn<number>([1,2])   //此時(shí)數(shù)組中元素就必須是number類型

再例如,我們將數(shù)組的map方法進(jìn)行加工

// 定義一個(gè)map函數(shù)
//第一個(gè)參數(shù)約定傳入一個(gè)數(shù)組
//第二個(gè)參數(shù)約定傳入一個(gè)函數(shù) 
//此函數(shù)的返回值就是操作之后的數(shù)組

function map <In,Out>(arr:In[], fun:(val:In)=>Out):Out[] {
    return arr.map(fun)
}

const res = map([1,2,3,4,5],(i)=>i+1)
console.log(res) ///[ 2, 3, 4, 5, 6 ]

泛型約束(限制條件)

默認(rèn)情況下,泛型函數(shù)的類型變量 T 可以代表多個(gè)類型,這導(dǎo)致在泛型函數(shù)內(nèi)部無法訪問任何屬性

當(dāng)我們需要用到一些屬性的時(shí)候,就無法使用,會(huì)報(bào)錯(cuò),比如字符串、數(shù)組的長度

接下來我們看個(gè)例子

// 定義一個(gè)函數(shù),傳入兩個(gè)值,來比較哪個(gè)更長 ,相等就返回0
function compare <T extends {length: number}> (a:T, b:T){
    if(a.length < b.length){
        return b
    }else if(a.length === b.length){
        return (a.length - b.length)
    }else{
        return a
    }
}
const res1 = compare('哈哈哈','哈哈哈')
console.log(res1) // 0

const res2 = compare('我真酷','你酷')
console.log(res2) // '我真酷'

const res3 = compare('我酷','你真酷')
console.log(res1) // '你真酷'

當(dāng)然,當(dāng)我們在使用泛型約束的時(shí)候,也會(huì)出現(xiàn)常見的錯(cuò)誤

//我們定義一個(gè)泛型T ,并讓其繼承一個(gè)有l(wèi)ength屬性的對象
//給參數(shù)指定類型,第一個(gè)參數(shù)為T類型,第二參數(shù)為number類型
//返回值也為T類型
const myTs =<T extends {length:number}> (obj:T,num:number):T => {
        if(obj.length >= num){
            return obj
        }else{
            return {length:num} //此處會(huì)報(bào)錯(cuò)
        }
    }

這個(gè)函數(shù)的返回值看似沒問題,其實(shí)會(huì)報(bào)錯(cuò)

我們把這個(gè)代碼稍微改造一下,就容易理解了

const myTs =<T extends {length:number}> (obj:T,num:number):T => {
        if(obj.length >= num){
            return obj
        }else{
            const res = {length:num}   //把鼠標(biāo)放上res,可以看到res的類型是 {length:number}
            return  res       //但是我們約定的返回值是T類型,
                              //這里會(huì)報(bào)錯(cuò) 不能將類型“{ length: number; }”分配給類型“T”
        }
    }

我們將代碼改造成這樣就是正確的

 const myTs =<T extends {length:number}> (obj:T,num:number):T => {
        if(obj.length >= num){
            return obj
        }else{
             obj.length = num
            return  obj
        }
    }
   const res =  myTs({length:3},6)
   console.log(res)   //{ length: 6 }

泛型函數(shù)調(diào)用指定類型

在定義完成泛型函數(shù)之后,我們?nèi)フ{(diào)用函數(shù)并傳參的時(shí)候,并沒有去指定參數(shù)類型,當(dāng)多個(gè)參數(shù)類型不同的時(shí)候,TS就會(huì)報(bào)錯(cuò),接下來請看一個(gè)例子:

定義一個(gè)泛型函數(shù),用來連接數(shù)組,約定參數(shù)必須為數(shù)組

 // 定義一個(gè)連接兩個(gè)數(shù)組的函數(shù) 
    // 并約定兩個(gè)參數(shù)的類型都為泛型數(shù)組
    // 且返回值也為一個(gè)泛型數(shù)組
    const mergeArray = <T> (arr1 : T[],arr2 : T[]) :T[] => {
        // concat 為數(shù)組連接,不會(huì)改變原數(shù)組,需要使用值接收
        return arr1.concat(arr2)
    }
    // 但是當(dāng)我們在使用這個(gè)函數(shù)的時(shí)候就會(huì)發(fā)現(xiàn)
    // 如果第一個(gè)參數(shù)數(shù)組中的元素都為number類型
    // 而第二個(gè)參數(shù)數(shù)組的類型與第一個(gè)不一致時(shí)
    // TS就會(huì)報(bào)錯(cuò),這樣使用就只能傳入兩個(gè)一樣類型的數(shù)組參數(shù)
    mergeArray([1,2,3],['a','b']) //報(bào)錯(cuò),不能將類型“string”分配給類型“number”

所以當(dāng)我們調(diào)用函數(shù)的時(shí)候就可以指定參數(shù)類型

這樣參數(shù)就是我們指定的參數(shù)類型了

 const  res=  mergeArray<number | string>([1,2,3],['a','b','c'])
    console.log(res)  //[ 1, 2, 3, 'a', 'b', 'c' ]

總結(jié)

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

相關(guān)文章

  • JS 設(shè)置Cookie 有效期 檢測cookie

    JS 設(shè)置Cookie 有效期 檢測cookie

    這篇文章主要介紹了JS 設(shè)置Cookie 有效期 檢測cookie的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • javascript中基本類型和引用類型的區(qū)別分析

    javascript中基本類型和引用類型的區(qū)別分析

    大多數(shù)人系統(tǒng)學(xué)習(xí)過的程序設(shè)計(jì)語言,在這些語言的學(xué)習(xí)過程中最早學(xué)到的幾個(gè)要點(diǎn)之一就是值類型和引用類型的區(qū)別。下面我們來看一下在 JavaScript 中基本數(shù)據(jù)類型(Primitive Types)和引用類型(Reference Types)的區(qū)別。
    2015-05-05
  • javaScript事件學(xué)習(xí)小結(jié)(四)event的公共成員(屬性和方法)

    javaScript事件學(xué)習(xí)小結(jié)(四)event的公共成員(屬性和方法)

    這篇文章主要介紹了javaScript事件學(xué)習(xí)小結(jié)(四)event的公共成員(屬性和方法)的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-06-06
  • 解析John Resig Simple JavaScript Inheritance代碼

    解析John Resig Simple JavaScript Inheritance代碼

    上網(wǎng)也查了一下對些的理解說的都不是很清楚. 在翻閱的同時(shí)找到了一篇 分析這篇文章的文章 哈哈 分析的很詳細(xì). (Join Resig 大師的 "Simple Inheritance" 使用了很多有意思的技巧) 如果你有時(shí)間, 并對此感興趣不訪好好看看. 我相信多少會(huì)有所收益的.
    2012-12-12
  • js實(shí)現(xiàn)頁面刷新滾動(dòng)條位置不變

    js實(shí)現(xiàn)頁面刷新滾動(dòng)條位置不變

    本文介紹了js實(shí)現(xiàn)頁面刷新滾動(dòng)條位置不變的實(shí)例代碼,需要的朋友可以看下
    2016-11-11
  • Javascript oop設(shè)計(jì)模式 面向?qū)ο缶幊毯唵螌?shí)例介紹

    Javascript oop設(shè)計(jì)模式 面向?qū)ο缶幊毯唵螌?shí)例介紹

    這篇文章主要介紹了Javascript oop設(shè)計(jì)模式 面向?qū)ο缶幊毯唵螌?shí)例介紹的相關(guān)資料,這里附有實(shí)例代碼幫助大家學(xué)習(xí)理解,需要的朋友可以參考下
    2016-12-12
  • Bootstrap進(jìn)度條學(xué)習(xí)使用

    Bootstrap進(jìn)度條學(xué)習(xí)使用

    這篇文章主要為大家詳細(xì)介紹了Bootstrap進(jìn)度條的學(xué)習(xí)使用,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-02-02
  • JS對大量數(shù)據(jù)進(jìn)行多重過濾的方法

    JS對大量數(shù)據(jù)進(jìn)行多重過濾的方法

    今天在工作中遇到一個(gè)問題,當(dāng)前端通過Ajax從后端取得了大量的數(shù)據(jù),需要根據(jù)一些條件過濾,但是發(fā)現(xiàn)寫的過濾方法有問題,后來仔細(xì)的查找問題,通過網(wǎng)上的資料終于解決了這個(gè)問題,現(xiàn)在將解決的過程以及解決方法分享給大家,有需要的朋友們可以參考借鑒。
    2016-11-11
  • mock.js模擬前后臺(tái)交互

    mock.js模擬前后臺(tái)交互

    這篇文章主要為大家詳細(xì)介紹了mock.js模擬前后臺(tái)交互的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • 基于JavaScript實(shí)現(xiàn)評論框展開和隱藏功能

    基于JavaScript實(shí)現(xiàn)評論框展開和隱藏功能

    本文通過實(shí)例代碼給大家介紹了基于JavaScript實(shí)現(xiàn)評論框展開和隱藏功能,感興趣的朋友參考下吧
    2017-08-08

最新評論