泛型
指在定义函数、接口或类的时候,不预先指定具体的类型,而在使用的时候再指定具体类型的一种特性。
function getArr<T>(value: T, count: number): T[]{
const arr: Array<T> = [];
for (let i = 0; i < count; i++){
arr.push(value)
}
return arr
}
const arr5 = getArr<number>(3.1212, 4);
const arr6 = getArr<string>("aaa", 3);
console.log(arr5[0].toFixed(2));//3.12
console.log(arr6[0].split(""));//['a','a','a']
多个泛型参数的函数:
//多个泛型参数的函数
function getArr<K, V>(value1: K, value2: V): [K, V]{
return [value1,value2]
}
const new1 = getArr<string, number>('tom', 123)
const new2 = getArr<number, boolean>(100.1111, true)
console.log(new2[0].toFixed(2));//100.11
console.log(new1[0]);//tom
泛型接口
在定义接口时, 为接口中的属性或方法定义泛型类型 ,在使用接口时, 再指定具体的泛型类型
//泛型接口
(() => {
interface BaseCURD<T>{
data: Array<T>
add:(t: T)=> T
getUserId:(id:number)=>T
}
class User{
id: number
name: string
age?: number
constructor(id: number, name: string) {
this.id = id;
this.name=name
}
}
class UserCurd implements BaseCURD<User>{
data: Array<User> = []
add(user: User): User{
user.id = Date.now() + Math.random();
this.data.push(user);
return user
}
getUserId(id) {
return this.data.find(user=>user.id===id)
}
}
const uc: UserCurd = new UserCurd();
uc.add(new User(12, "zhangsan"))
uc.add(new User(13, "sss"))
const { id, name } = uc.add(new User(14, "zhang"))
console.log(id);
console.log(name);
console.log(uc.add(new User(15, "hang")));
})()
泛型类:
class Person<T>{
defaultValue:T
add:(x: T, y: T)=> T
}
const newP: Person<number> = new Person<number>();
newP.add=function(x,y){
return x+y
}
console.log(newP.add(100,200));//300
泛型约束:
如果我们直接对一个泛型参数取length属性, 会报错, 因为这个泛型根本就不知道它有这个属性,所以可以利用泛型约束来实现下面这个例子就无法传number类型的数据,因为number没有length属性,会报错
//泛型约束
interface ILength{
length:number
}
function getLength<T extends ILength>(x: T): number{
return x.length
}
console.log(getLength<String>("iskdhybg"));//8