泛型:
- 軟件工程中,我們不僅要?jiǎng)?chuàng)建一致定義良好的API,同時(shí)也要考慮復(fù)用性,
- 組件不僅能夠支持當(dāng)前的數(shù)據(jù)類型,同時(shí)也能支持未來的數(shù)據(jù)類型,這在創(chuàng)建大型系統(tǒng)時(shí)可以提供十分靈活的功能
- 泛型就是解決 類 接口 方法的復(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]