TS-泛型

176 阅读2分钟

泛型就是解决 类、接口、方法的复用性以及对不特定数据类型对支持。

泛型函数

  • any 与 泛型的区别
// 使用 any : 入参类型 与 返回值类型 可以不一样
function getDataAny(value: any): any {
    return value + 'hhh';
}
console.log(getDataAny(12)); // 12hhh

// 使用 泛型  入参类型 与 返回值类型  必须一致
function getDataT<T>(value: T): T {
    return value;
    // return value + 'hhh'; // error 报错  传入的是number 返回的是string
}
console.log(getDataT<number>(12)); // 入参类型 与 返回值类型 一致
// getDataT<string>(12); // error 参数值不符合类型
console.log(getDataT<string>('str')); // str

泛型类

// 定义一个泛型类,用于输出最小值
class MinClass<T> {
    public list: T[] = [];
    add(value: T): void {
        this.list.push(value);
    }
    // 使用ASCII比较 字母
    min(): T {
        let minNum: T = this.list[0];
        for (let i = 0; i < this.list.length; i++) {
            if (minNum > this.list[i]) {
                minNum = this.list[i];
            }
        }
        return minNum;
    }
}
let numClass = new MinClass<number>();
numClass.add(10);
numClass.add(11);
numClass.add(3);
console.log(numClass.min()); // 3

let strClass = new MinClass<string>();
strClass.add('ddd');
strClass.add('ddc');
console.log(strClass.min()); // ddc
  • 把类作为参数类型的泛型类
// 定义一个User的类的作用就是映射数据字段,然后定义一个 MysqlDb 的类这个类用于操作数据库,然后把User类作为参数传入到 MysqlDb 类中
class User {
    userName: string | undefined;
    password: string | undefined;
}
class ArticleCate {
    title: string | undefined;
    desc: string | undefined;
    status: number | undefined;
}
class UserBoy {
    name: string | undefined;
    age: number | undefined;
    sex?: string | undefined;
    // 构造函数 初始化参数
    constructor(params: {
        name: string | undefined,
        age: number | undefined,
        sex?: string | undefined
    }) {
        this.name = params.name;
        this.age = params.age;
        this.sex = params.sex;
    }
}
class MysqlDb<T> {
    add(obj: T):boolean {
        console.log(obj)
        return true;
    }
}

let user = new User();
user.userName = '张三';
user.password = '123456';
let  Db = new MysqlDb();
// User {userName: "张三", password: "123456"}
console.log(Db.add(user)); // true

let info = new ArticleCate();
info.title = '人民日报';
info.desc = '这是新闻';
info.status = 123;
let  MyDb = new MysqlDb();
// ArticleCate {title: "人民日报", desc: "这是新闻", status: 123}
console.log(MyDb.add(info)); // true

let userBoy = new UserBoy({
    name: '张三',
    age: 14,
    // sex: '女'
})
userBoy.sex = '男'
let userDb = new MysqlDb<UserBoy>();
// UserBoy {name: "张三", age: 14, sex: "男"}
console.log(userDb.add(userBoy)); // rrue

泛型接口

  • 写法一
interface ConfigFn {
    <T>(value: T): T;
}
let getData: ConfigFn = function<T>(value: T):T {
    return value;
}
console.log(getData<number>(12)); // 12
// console.log(getData<string>(12)); // error 类型“12”的参数不能赋给类型“string”的参数。
console.log(getData<string>('str')); // str
  • 写法二 (常用)
interface ConfigFun<T> {
    (value: T): T;
}
function getDataFunc<T>(value: T): T {
    return value;
}
let myDataFunc: ConfigFn = getDataFunc;
console.log(getDataFunc<number>(12)); // 12
// console.log(getData<string>(12)); // error 类型“12”的参数不能赋给类型“string”的参数。
console.log(getDataFunc<string>('str')); // str