泛型的作用
**作用: **泛型用来解决类、接口、方法的复用性,以及对不特定数据类型的支持
泛型函数:简单小例子
function getData<T>(value:T):T{
return value;
}
console.log(getData<number>(123));
console.log(getData<string>('123str'));
泛型类:案例-最小堆算法
**作用:**泛型可以帮助我们避免重复的代码以及对不特定数据类型的支持(类型校验),下面我们看看把类当做参数的泛型类
1.定义个类
2.把类作为参数来约束数据传入的类型
/**
* 泛型类
* 例子:最小堆算法
* 作用:传入一串数字或string,返回最小值
*/
class MinClass<T>{
public list:T[] = [];
add(value:T) {
this.list.push(value);
}
min():T{
let minNum = this.list[0]
for(let i=0; i<this.list.length; i++) {
if(minNum > this.list[i]) minNum = this.list[i];
}
return minNum;
}
}
// 数组中都是数字
let m1 = new MinClass<number>();
m1.add(3);
m1.add(1);
m1.add(2);
console.log(m1.min());
// 数组中都是字符串
let m2 = new MinClass<string>()
m2.add('b');
m2.add('a');
m2.add('c');
console.log(m2.min());
泛型接口
1.写法1
interface Config{
<T>(value:T):T
}
let getData:Config = function<T>(value:T):T {
return value;
}
getData<string>('张三')
2.写法2
interface Config<T>{
(value:T):T
}
function getData<T>(value:T):T {
return value;
}
let myGetData:Config<string> = getData;
console.log(getData('张三'));
高阶:把类作为参数来约束数据传入的类型
改造前
user
class User{
username: string | undefined;
password: string | undefined;
}
class MysqlDb{
// 用类来校验参数的合法性
add(user: User):boolean{
console.log('user: ', user);
return true;
}
}
let u = new User();
u.username = '张三';
u.password = '123';
let Db = new MysqlDb();
Db.add(u)
article
class ArticleCate{
title:string | undefined;
desc:string | undefined;
status:number | undefined
}
class MysqlDb{
add(info:ArticleCate):boolean{
console.log('info: ', info);
return true;
}
}
let art = new ArticleCate();
art.title = '新闻1';
art.desc = '123';
art.status = 1;
let Db = new MysqlDb();
Db.add(art)
总结
mysqlDb没有重复利用
改造
操作数据库的泛型类
// 操作数据库的泛型类
class MysqlDb<T>{
add(info:T):boolean{
console.log('info: ', info);
return true;
}
}
给user表增加数据
// 给user表增加数据
class User{
username: string | undefined;
password: string | undefined;
}
let u = new User()
u.username = '张三';
u.password = '123';
let Db = new MysqlDb<User>()
Db.add(u)
给文章表增加数据
// 给文章表增加数据
class ArticleCate{
title:string | undefined;
desc:string | undefined;
status:number | undefined;
constructor(params:{
title:string | undefined,
desc:string | undefined,
status?:number | undefined
}){
this.title = params.title;
this.desc = params.desc;
this.status = params.status;
}
}
let art = new ArticleCate({
title:'新闻1',
desc: 'xxx',
// status: 1
});
let ADb = new MysqlDb<ArticleCate>();
ADb.add(art);