一、什么是泛型
泛型:不预先确定的数据类型,具体的类型在使用中才能确定,简单理解为不确定的类型。
二、泛型的使用场景
当我们写一个函数时,不仅要考虑函数的内部的逻辑,也要考虑函数的复用性,希望这个函数能支持多种类型的参数及返回值。
三、函数中使用泛型
例1:
function connectA(firstName: string, secondName: string) {
return `${firstName}${secondName}`
}
let result = connectA("小", "高");
console.log(result) //小高
function connectB(firstName: number, secondName: number) {
return `${firstName}${secondName}`
}
let result = connectB(100, 86);
console.log(result) //10086
上面两段代码中,第一个函数将类型为string的两个参数进行了拼接,第二个函数将类型为number的参数进行了拼接,函数内部的代码都是一样的,那么现在希望能有一个函数,能够对不同类型的参数进行拼接,这时就要用到泛型,我们使用泛型对上面的函数进行改造
function connect<T>(firstName: T, secondName: T) {
return `${firstName}${secondName}`
}
let resultName = connect<string>("小", "高");
console.log(resultName); //小高
let resultNum = connect<number>(100, 86);
console.log(resultNum); //10086
上面的代码中,我们在函数的后面加上< T >(自定义名称,一般用T代表),定义为泛型函数,参数的后面也加上T,代表着当前参数类型不确定,需要调用时根据传过来的参数来判定。在函数调用时我们使用< string >或者< number>去定义类型,代表当前参数类型,这时就达到了我们刚才想要复用的目的。
------------------------------------分割线------------------------------------
有这样一个场景,我们写一个函数,要求参数可以是任意类型,返回值也可以是任意类型。
function Fn(arg: any): any {
return arg
}
Fn(1234);
Fn("哈哈");
我们将函数参数的类型和函数返回值的类型都设置为any,这确实满足了上面的条件,但是很多情况下我们希望传入的类型和返回的类型相同,这时这个函数就不能够限定了。那么我们也要使用泛型进行定义,上面的函数可以改造为
function Fn<T>(arg: T): T {
return arg;
}
Fn(1234);
Fn("哈哈");
上面的代码可以理解为函数名后面加< T >代表为泛型函数,属性值后面加T代表吸取调用参数的类型,后面的T可以理解为函数的返回值也要和前面的保持一致。
以上就是泛型及泛型函数的使用。