泛型:不预先确定数据类型,具体的类型在使用的时候才确定。
好处:函数和类可以轻松支持多种类型;不必写多条函数重载;灵活控制类型之间的约束
泛型函数
// function log(value:any):any{
// console.log(value)
// return value
// }
function log<T>(value:T):T{//为泛型函数:对比上面使用any的好处是能保证输入和输出为同一类型
console.log(value)
return value
}
//两种调用方式
log<string[]>(['a','b'])
log(['a','b'])//第二种省略是利用ts的类型推断
//
type Log=<T>(value:T)=>T
let log1:Log=log
//泛型接口
interface Logi<T>{//所有成员都可以受到泛型约束
(value:T):T
}
let myLogi:Logi<number>=log
myLogi(1)
//泛型接口
interface Logy<T=string>{//所有成员都可以受到泛型约束
(value:T):T
}
let myLogy:Logy=log
myLogy('1')
泛型类和泛型约束
//泛型类
class Logc<T>{
run(value:T){
console.log(value)
return value
}
}
let myLogc1=new Logc<number>()
myLogc1.run(1)
let myLogc2=new Logc()//没有指定类型就可以传任意类型
myLogc2.run(['2'])
//泛型约束
interface Length{
length:number
}
function logfn<T extends Length>(value:T){//输入的参数必须要有length属性才合法
console.log(value)
return value
}
logfn([1,2])
logfn('logfn')
logfn({length:9})