Ts学习日记(四)

目录

摘要

1、什么是泛型

2、定义泛型

2.1、如何使用泛型

2.2、泛型函数

2.3、泛型接口

2.3、泛型类

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);//报错


// 同理操作其他数据库的类操作也能这样写

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

回首&逝去~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值