7.泛型的入门及高阶使用

本文通过示例详细介绍了JavaScript中的泛型,包括泛型函数、泛型类和泛型接口,展示了如何提高代码复用性和类型安全性。通过改造代码,将数据库操作类`MysqlDb`转化为泛型类,实现了对不同类型数据如`User`和`ArticleCate`的有效处理,从而提高了代码的灵活性和可维护性。
摘要由CSDN通过智能技术生成

泛型的作用

**作用: **泛型用来解决类、接口、方法的复用性,以及对不特定数据类型的支持

泛型函数:简单小例子

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);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值