TypeScript泛型約束條件示例詳解
什么是泛型
兩個(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)文章
javaScript事件學(xué)習(xí)小結(jié)(四)event的公共成員(屬性和方法)
這篇文章主要介紹了javaScript事件學(xué)習(xí)小結(jié)(四)event的公共成員(屬性和方法)的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-06-06解析John Resig Simple JavaScript Inheritance代碼
上網(wǎng)也查了一下對些的理解說的都不是很清楚. 在翻閱的同時(shí)找到了一篇 分析這篇文章的文章 哈哈 分析的很詳細(xì). (Join Resig 大師的 "Simple Inheritance" 使用了很多有意思的技巧) 如果你有時(shí)間, 并對此感興趣不訪好好看看. 我相信多少會(huì)有所收益的.2012-12-12js實(shí)現(xiàn)頁面刷新滾動(dòng)條位置不變
本文介紹了js實(shí)現(xiàn)頁面刷新滾動(dòng)條位置不變的實(shí)例代碼,需要的朋友可以看下2016-11-11Javascript oop設(shè)計(jì)模式 面向?qū)ο缶幊毯唵螌?shí)例介紹
這篇文章主要介紹了Javascript oop設(shè)計(jì)模式 面向?qū)ο缶幊毯唵螌?shí)例介紹的相關(guān)資料,這里附有實(shí)例代碼幫助大家學(xué)習(xí)理解,需要的朋友可以參考下2016-12-12Bootstrap進(jìn)度條學(xué)習(xí)使用
這篇文章主要為大家詳細(xì)介紹了Bootstrap進(jìn)度條的學(xué)習(xí)使用,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-02-02JS對大量數(shù)據(jù)進(jìn)行多重過濾的方法
今天在工作中遇到一個(gè)問題,當(dāng)前端通過Ajax從后端取得了大量的數(shù)據(jù),需要根據(jù)一些條件過濾,但是發(fā)現(xiàn)寫的過濾方法有問題,后來仔細(xì)的查找問題,通過網(wǎng)上的資料終于解決了這個(gè)問題,現(xiàn)在將解決的過程以及解決方法分享給大家,有需要的朋友們可以參考借鑒。2016-11-11基于JavaScript實(shí)現(xiàn)評論框展開和隱藏功能
本文通過實(shí)例代碼給大家介紹了基于JavaScript實(shí)現(xiàn)評論框展開和隱藏功能,感興趣的朋友參考下吧2017-08-08