简介
泛型是在类型不固定的情况下产生的
function fn(arr){
return arr[0]
}
假设一个函数,总是返回数组的第一个元素,如果这个数组的类型不固定 就可以用泛型表示
function fn<T>(arr:T[]):T{
return arr[0]
}
函数名后边一对尖括号,里边写上名字,就代表是一种类型,我们通常写成T,就相当于定义了一个类型的变量,后边就可以使用了,这样不管你传什么类型的数组,都不会报错了。
fn<number>([1,2,3])
fn([1,2,3])
通常情况下,使用的时候类型不必传,因为ts可以自己推导,某些特殊情况下需要手动传入
function fn<T>(arr1:T[], arr2:T[]):T[] {
return arr1.concat(arr2);
}
let result = fn<number|string>([1, 2, 3], ['a', 'b', 'c'])
console.log('result:', result);
因为两个数组的元素类型不同,如果你不明确给出是会报错的。
function fn<T,U>(arr1:T[], arr2:U[]):(T|U)[] {
return arr1.concat(arr2);
}
let result = fn([1, 2, 3], ['a', 'b', 'c'])
console.log('result:', result);
可能有些同学会想到这样写,这样是不行的 因为数值类型的数组不能连接字符串类型的数组,你需要转换成同一类型才可以
泛型的应用场景
泛型的格式是:名称<T>
//函数的泛型
function fn<T>(arg:T):T{
return arg
}
//接口的泛型
interface Person<T>{
name:string,
hobby:T[]
}
//类型别名的泛型
type Nullable<T> = T | undefined | null;
默认值
function fn<T=string>(arg:T):T{
return arg
}
注意事项
尽量少用泛型、