前言:
只是一篇学习笔记!!!
正文:
泛型:指在定义函数、接口或类的时候,不预先指定具体类型,而在使用的时候再指定类型。
//泛型函数
//需求:创建一个方法使返回值的类型与传入参数的类型相同
function getSameType<T>(value:T):T{
return value
}
console.log(getSameType(<number> 2)) //在使用的时候要指明类型,其实可以不指明,ts会进行类型推断
console.log(getSameType(<string>'4'))
在使用泛型变量的时候,必须把这些变量当做任意或所有类型。
function getSameType<T>(value:T):number{
return value.length //类型T上不存在属性“lebgth”
}
console.log(getSameType(<string>'123')) //即使在使用的时候指定的类型存在length属性,还是报错
解决方案:(使用接口约束类型)
interface Itype{
length:number
}
function getSameType<T extends Itype>(value:T):number{
return value.length
}
getSameType(<string>'123')
getSameType(<Array<number>>[1,2,3])
getSameType(<number>123) //类型"number"的参数不能赋给类型"Itype"的参数
定义接口:(在使用接口的时候指定类型)
方式一:
interface IArr{
<T>(value:T,count:number):Array<T> //定义函数的格式
}
const getArr1:IArr = function <T>(value:T,count:number):T[]{
}
方式二:
interface IArr<T>{
(value:T,count:number):Array<T>
}
const getArr1:IArr<string> = function <T>(value:T,count:number):T[]{ //在使用接口的时候就要确定类型
}
// 定义接口
interface Idata{
id:number,
title:string,
content:string,
createTime:string
}
interface Itest<T>{
code:T,
data:Idata,
message:string
}
function responseFn<U>(arg:U,count:number):Itest<number>{ //在使用的时候要指定类型
let newArr:U[] = []
for(let i = 0; i<count;i++){
newArr.push(arg)
}
console.log(newArr)
return {
code:200,
data:{
id:1,
title:'test1',
content:'test1',
createTime:'2022-01-02'
},
message:'成功'
}
}
let test1 = responseFn(<string>'2',2)
console.log(test1)
let test2 = responseFn(<number> 2 ,4)
console.log(test2)