6.泛型-函數(shù)

泛型:

  1. 軟件工程中,我們不僅要?jiǎng)?chuàng)建一致定義良好的API,同時(shí)也要考慮復(fù)用性,
  2. 組件不僅能夠支持當(dāng)前的數(shù)據(jù)類型,同時(shí)也能支持未來的數(shù)據(jù)類型,這在創(chuàng)建大型系統(tǒng)時(shí)可以提供十分靈活的功能
  3. 泛型就是解決 類 接口 方法的復(fù)用性和對不確定數(shù)據(jù)類型的支持(當(dāng)然如果說不確定可以使用any類型,那相當(dāng)于放棄了類型的檢測)

大白話:就是預(yù)先定義的類型是固定的,而泛型幫我們解決的就是它可以讓約定類型變成動(dòng)態(tài)的,使用的時(shí)候再去定義,顯然泛型可以讓我們的代碼可復(fù)用性更高

泛型定義

let arr:Array<number> = []; 
// 等價(jià)于 let arr:number[] = [];

一. 泛型函數(shù)

泛型可以支持不特定的數(shù)據(jù)類型,要求傳入的參數(shù)和返回值是一致的

 function returnData<T>(val:T):T {
    return val;
 }

console.log(returnData('a')); // 默認(rèn) 傳入啥,泛型檢測就是啥 =>  function returnData<"a">(val: "a"): "a"
console.log(returnData<number>(1)); // 檢測傳入類型是number類型 => function returnData<number>(val: number): number
// console.log(returnData<boolean>(1)); // 報(bào)錯(cuò): 檢測傳入類型是boolean類型,但輸入的是number => function returnData<boolean>(val: boolean): boolean


// 2. 對比2.1如果使用any作為value的類型及返回類型,則相當(dāng)于放棄類型的檢測
function createArray(length: number, value: any): Array<any> {
    let result = [];
    for (let i = 0; i < length; i++) {
        result[i] = value;
    }
    return result;
}

createArray(2, 'A'); // ['A', 'A']; 

// 2.1 那我們就可以使用泛型來定義函數(shù)的標(biāo)準(zhǔn),在用的時(shí)候定義好類型,靈活且復(fù)用性高
function createArray<T>(length: number, value: T): Array<T> {
    let result: T[] = [];
    for (let i = 0; i < length; i++) {
        result[i] = value;
    }
    return result;
}

createArray<string>(2, 'A'); // ['A', 'A'];

1. 當(dāng)泛型不指定類型

函數(shù)調(diào)用不指定類型的時(shí)候,編譯并不會報(bào)錯(cuò),那我們createArray后面的<T>就只相當(dāng)于一個(gè)占位符,但當(dāng)你初始化這個(gè)函數(shù)后,那么ts會啟動(dòng)類型推論,也就是說,初始化以后,返回值的類型就被固定了,當(dāng)你賦值其他類型的值時(shí),會發(fā)生編譯錯(cuò)誤

function createArray<TYPE>(length: number, value: TYPE): Array<TYPE> {
    let result: TYPE[] = [];
    for (let i = 0; i < length; i++) {
        result[i] = value;
    }
    return result;
}

createArray(2, 'A'); // ['A', 'A'];

2. 泛型多個(gè)參數(shù)類型約定

這段代碼肯定會觸發(fā)類型推論,因?yàn)閙oreType在調(diào)用時(shí)沒有傳類型,如果傳類型,那肯定是按照類型來約束,其次,可以看到我們傳遞了一個(gè)array作為參數(shù)進(jìn)去,接受參數(shù)的形參是result,result作為形參,類型約束時(shí)用了一個(gè)中括號包括起來了,它相當(dāng)于對數(shù)組中每一個(gè)元素的類型約定,下標(biāo)是一一對應(yīng)的,也就是說,實(shí)參和形參一一對應(yīng),而約定返回值的類型放在了一個(gè)中括號中,這表示返回值是一個(gè)array,類型和返回值一一對應(yīng)

function moreType<N, S>(result: [N, S]): [S, N] {
    return [result[1], result[0]];
}
moreType([1, 'A']); // ['A', 1]

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • object 變量可指向任何類的實(shí)例,這讓你能夠創(chuàng)建可對任何數(shù)據(jù)類型進(jìn)程處理的類。然而,這種方法存在幾個(gè)嚴(yán)重的問題...
    CarlDonitz閱讀 1,021評論 0 5
  • Java為什么引入泛型 眾所周知,Java 5才最大的亮點(diǎn)就是引入泛型,那么Java引入泛型的目的是什么?這就需要...
    大棋17閱讀 1,920評論 0 3
  • C# 泛型(Generics) 泛型概述 泛型是C#編程語言的一部分,它與程序集中的IL(Intermediate...
    OctOcean閱讀 2,327評論 0 4
  • “泛型”這個(gè)術(shù)語的意思是:"適用于許多許多的類型”。如何做到這一點(diǎn)呢,正是通過解耦類或方法與所使用的類型之間的約束...
    王偵閱讀 1,352評論 0 0
  • 四月正是春日最好的賞花之際,所謂百花繁盛,春暖拂面。 雖說最為經(jīng)典的桃花已呈隨風(fēng)紛落之態(tài),那揚(yáng)揚(yáng)灑灑的嫩粉花瓣在四...
    一隻有情懷的貓閱讀 1,227評論 13 25

友情鏈接更多精彩內(nèi)容