泛型 Generic
泛型是指定義函數(shù)榜聂、接口或類的時(shí)候,不預(yù)先指定具體的類型嗓蘑,而在使用的時(shí)候再指定類型的一種特性.
有這樣一個(gè)函數(shù)handle须肆,接收一個(gè)參數(shù),number數(shù)組或者string數(shù)組桩皿,并返回?cái)?shù)組中的最小值豌汇。
let handle = (arr: any[]): any => {
var min=arr[0];
arr.forEach((value)=>{
if(value<min){
min=value;
}
});
return min;
}
console.log(handle(["blue","red","green","pick"]))// blue
console.log(handle([13.4, 2.2, 3.6, 46.5, 85.8]))//2.2
上面函數(shù)handle由于不確定參數(shù)傳入的類型,所以將類型都規(guī)定為any泄隔,雖然滿足了需求拒贱,卻丟失了對(duì)類型的檢測(cè),比如以下代碼:
let value = handle([1,2,3,4,5])
value.split(",") // 跳過(guò)了類型檢查,瀏覽器報(bào)錯(cuò)Uncaught TypeError: value.split is not a function,
value = handle(["h","e","l","l","o"])
value.toFixed() // 跳過(guò)了類型檢查逻澳,瀏覽器報(bào)錯(cuò)Uncaught TypeError: value.toFixed is not a function
所以我們就需要使用泛型闸天,泛型可以使我們的API支持多種類型數(shù)據(jù)以及多種類型的數(shù)據(jù)檢查, 更好的約束API使用者規(guī)范的使用我們的插件或者庫(kù)斜做。
//把handle方法使用泛型改寫下
let handle1 = <T>(arr: T[]): T => {
var min=arr[0];
arr.forEach((value)=>{
if(value<min){
min=value;
}
});
return min;
}
let value1 = handle1<Number>([13.4, 2.2, 3.6, 46.5, 85.8])
value1.split(",") // 類型檢查苞氮,類型“number”上不存在屬性“split”
console.log(value1.toFixed()) // 2
let value2 = handle1<String>(["blue","red","green","pick"])
value2.toFixed() // 類型檢查,屬性“toFixed”在類型“string”上不存在
console.log(value2.split('')) // ["b", "l", "u", "e"]
泛型函數(shù)
let handle2 = <T>(arr: T[]): T => {
var min=arr[0];
arr.forEach((value)=>{
if(value<min){
min=value;
}
});
return min;
}
let value3 = handle2<Number>([13.4, 2.2, 3.6, 46.5, 85.8])
泛型接口
interface Interface{
<T>(arr: T[]):T,
}
// 泛型變量也可以提到接口定義上陨享, 這樣接口里就都可以使用泛型變量了
interface Interface1<T>{
(arr: T[]):T
}
泛型約束:使用 extends指定泛型類型的繼承關(guān)系葱淳。
interface HasLength {
length: number;
}
function handle3<T extends HasLength>(arg: T): T {
console.log(arg.length);
return arg;
}
handle3({ length: 2, value: 3 }); //傳入?yún)?shù)必須有l(wèi)ength屬性
在泛型參數(shù)中使用類型參數(shù)。
規(guī)定參數(shù)propName必須是obj中的一員抛姑。
const getProps = <T, K extends keyof T>(obj: T, propName: K) =>{
return obj[propName]
}
const objs = {
a:'a',
b:'b'
}
getProps(objs, 'a') // 'a'
// getProps(objs, 'c') // 類型“"c"”的參數(shù)不能賦給類型“"a" | "b"”的參數(shù)