泛型可以让【函数】等,与多种【不同的类型】一起工作,灵活可复用。
通俗一点就是:泛型是 可变 的。
泛型函数
语法
function 函数名<Type>(temp:Type):Type{
return temp
}
函数名<string>('123')
函数名<number>(1)
泛型约束
之前的类型参数,可以传递任何类型,没有限制。
如果希望有限制 → 泛型约束
语法
interface 接口 {
属性:类型
}
// 传入的类型必须要有 接口中的属性
function 函数<Type extends 接口>() {}
注意:传入的类型必须要有 接口中的属性
实例
interface ILength {
length:number
}
function fn<T extends ILength>(param:T){
console.log("",param.length)
}
多个泛型参数
日常开发中,如果有需要,可以添加多个 类型变量。
function func<T, T1>(param: T, param1: T1) {
console.log('参数1', param)
console.log('参数2', param1)
}
func<string, number>('大白菜', 99)
func<string[], boolean[]>(['小脑虎'], [false])
泛型接口
定义接口的时候,结合泛型定义,就是泛型接口。
语法
interface 接口<Type>{
// 内部使用Type
}
实例
interface IdFunc<Type> {
id: (value: Type) => Type
ids: () => Type[]
}
let obj: IdFunc<number> = {
id(value) {
return value
},
ids() {
return [1, 3, 5]
}
}
泛型类
定义类的时候,结合泛型定义,就是泛型类。
语法
class 类名<Type>{
// 内部可以使用Type
}
实例
class Person<T> {
id: T
constructor(id: T) {
this.id = id
}
getId(): T {
return this.id
}
}
// 使用
let p = new Person<number>(10)