TS系列教程十二:泛型

83 阅读1分钟

简介

泛型是在类型不固定的情况下产生的

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
}

注意事项

尽量少用泛型、