泛型:软件工程中,我们不仅要创建一致的定义良好的API,同时也要考虑可重用性。组件不仅能够支持当前的数据类型,同时也能支持未来的数据类型,这在创建大型系统时为你提供了十分灵活的功能。
像C#和Java这样的语言中,可以使用泛型来创建可重用的组件,一个组件可以支持多种类型的数据。这样用户就可以以自己的数据类型来使用组件。
通俗理解:泛型就是解决类 接口 方法的复用性、以及对不特定数据类型的支持。
any实现同时返回string类型和number类型
any放弃了类型检查
比如:传入number类型必须返回numer类型
传入string类型必须返回string类型
function getData(value:any):any{
return 'test' // any:传入的参数和返回的参数可以不一致
}
getData(123)
getData('abc')
泛型
泛型:可以支持不特定的数据类型
要求:传入的参数和返回的参数类型一致
T表示泛型,具体什么类型是调用这个方法的时候决定的
function getData<T>(value:T):T{
return value
}
getData<number>(911) // 911
getData<string>('abc') // abc
function getData<T>(value:T):any{
return 'gg'
}
getData<number>(911)
getData<string>('hello')
泛型类
比如有个最小的堆栈算法,需要同时支持返回数字和字符串a-z两种类型
通过类的泛型来实现
class MinClass{
list:number[]=[]
add(num){
this.list.push(num)
}
min():number{
var minnum = this.list[0]
for(var i=0; i<this.list.length; i++){
if(minnum > this.list[i]){
minnum = this.list[i]
}
}
return minnum
}
}
var m = new MinClass()
m.add(2)
m.add(3)
m.add(5)
m.add(17)
console.log(m.min())
类的泛型
class MinClass<T>{
list:T[]=[]
add(value:T):void{
this.list.push(value)
}
min():T{
var minNum = this.list[0]
for(var i=0; i<this.list.length; i++){
if(minNum > this.list[i]){
minNum = this.list[i]
}
}
return minNum
}
}
var m = new MinClass<number>() // 实例化类,并且指定了T的类型是number
m.add(10)
m.add(8)
m.add(12)
console.log(m.min())
var m2 = new MinClass<string>()
m2.add('z')
m2.add('v')
m2.add('h')
console.log(m2.min())