目录
3、封装数据库操作库对泛型的应用(只是封装了一个框架,未实现具体功能)
摘要
Typescript泛型的学习。
1、什么是泛型
泛型是一种数据类型,当我们不知道使用什么数据类型是,可以使用泛型。 泛型也可以看出一个变量,用来接收数据类型。简单来说就是相当于定义一个保存数据类型的变量,你传给我的是什么数据类型,我就把这个变量变成什么数据类型。
2、定义泛型
2.1、如何使用泛型
泛型的定义是使用<泛型名>来定义的。接下来我们通过几个例子来看。
2.2、泛型函数
使用场景:传入参数和返回值类型必须一致时
// 像这种只能传递string类型并返回string类型,但是如果是类型不确定的时候,则要重新写对应类型的函数(使用泛型则可以解决这个问题)
function getDataString(value:string):string{
return value;
}
// 使用any类型则相当于放弃了数据类型的检查。逻辑复杂的情况下也可能导致最后返回结果和参数数据类型不一致,达不到预期效果
function getDataAny(value:any):any{
return value;
}
// 使用泛型定义函数,<>里面的字母可以用任意字母代替;不过通常使用大写字母T,代表type
function getData<T>(value:T):T{
return value;
}
2.3、泛型接口
// 泛型接口的定义(方式一)
interface getValue{
<T>(value:T):T;
}
const get:getValue = function<T>(val:T):T{
return val;
}
// 泛型接口定义(方式二)
interface getValue1<T>{
(val:T):T;
}
function get2<T>(val:T):T{
return val;
}
const get1:getValue1<string> = get2;
2.3、泛型类
一般使用在数据库操作中,可以使方法复用在各种数据库。
// 一般使用在数据库操作中
class User{
username:string | undefined;
password:string | undefined;
}
class Article{
title:string | undefined;
text:string | undefined;
}
class Db<T>{
//如果这样,那么只能添加user,如果添加文章,则还需要再创建个函数或者类(所以使用泛型)
// add(data:User):boolean{
// console.log(data);
// return true;
// }
// 泛型的写法(这样就可以根据创建实例的类型来判断传入值的类型去操作数据库)
add(data:T):boolean{
console.log(data);
return true;
}
}
// 使用泛型后的操作
const dUser = new Db<User>();
const dArticle = new Db<Article>();
const u1 = new User();
u1.username = "张三";
u1.password = "123456";
const a1 = new Article();
a1.text = "标题";
a1.title = "内容";
dUser.add(u1);
// dUser.add("12456");//报错
dArticle.add(a1);
// dArticle.add("1234");//报错
3、封装数据库操作库对泛型的应用(只是封装了一个框架,未实现具体功能)
只是一个封装的思路,具体未实现功能。没有思路的可以参考一下。
// 使用接口、泛型、类等操作;封装一个数据库操作库
// 定义数据库操作库的接口
interface DBI<T>{
add(info:T):boolean;
delete(id:number):boolean;
update(info:T,id:number):boolean;
get(id:number):any[];
}
// 定义数据库操作类------(注意,接口是泛型的话,那么实现接口的类也需要是泛型)
// 同理----操作MongoDB数据库的类也这样封装使用
class MysqlDB<T> implements DBI<T>{
// 暂时模拟,未实现功能
add(info: T): boolean {
console.log(info);
return true;
}
delete(id: number): boolean {
throw new Error("Method not implemented.");
}
update(info: T, id: number): boolean {
throw new Error("Method not implemented.");
}
get(id: number): any[] {
throw new Error("Method not implemented.");
}
}
class user1{
name:string | undefined;
age:number | undefined;
}
const u2 = new user1();
u2.name = "zhangsan";
u2.age = 18;
const mysqlDb = new MysqlDB<user1>();
mysqlDb.add(u2);
// mysqlDb.add(12);//报错
// 同理操作其他数据库的类操作也能这样写