版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/themagickeyjianan/article/details/87897556
/**
* <T> 泛型是一种任意类型,类型是安全的;
* any存在装箱和拆箱操作,不是类型安全的;
* T叫做占位符;
* 泛型是在实例化使用阶段才初始化;
* 泛型一般用于批量操作;
*/
/**
* 函数添加泛型接口
*/
function demo<T> (args: T): T{
return args;
}
function test(n: string): boolean {
return true;
}
function test1(n: number): string {
return "";
}
// any会进行装箱和拆箱,耗时; 存在转化类型安全问题
function test3(n: any): any {
return n;
}
// 泛型 优点:不存在装箱和拆箱; 类型也是安全的
function test5<T>(n: T): T {
return n;
}
test5<number>(1); // 传入的数值如果为string则会报错,因此泛型是类型安全的
/**
* 类
*/
class Person2<T>{
}
class UserInfo {
name: string = "";
age: number = -1;
}
let a2 = new Person2<UserInfo>();
/**
* 给类添加泛型接口
*/
interface School<T> {
add(n: T): boolean;
}
class Student2 implements School<UserInfo>{
add(n: UserInfo): boolean {
return false;
}
}
/**
* 后台调用不同的接口处理数据; 用ts泛型实现数据访问层的封装; ts对类、数组、函数等都可以进行约束,使用更加广泛
* 1.mysql
* 2.sqlserver
*/
// T
interface IData<T> {
Add(info: T): boolean;
Delete(info: T): boolean;
Update(info: T): T;
Search(info: T, id: number): T;
}
// 对mysql访问
class MysqlData<T> implements IData<T>{
Add(info: T): boolean {
return false;
}
Delete(info: T): boolean {
return false;
}
Search(info: T, id: number): T {
// @ts-ignore
return info;
}
Update(info: T): T {
// @ts-ignore
return undefined;
}
}
// 对mssql访问
class MssqlData<T> implements IData<T>{
Add(info: T): boolean {
return false;
}
Delete(info: T): boolean {
return false;
}
Update(info: T): T {
// @ts-ignore
return undefined;
}
Search(info: T, id: number): T {
return info;
}
}
//
class UserInfo2 {
name: string = "";
age: number = -1;
}
//
class UserData extends MysqlData<UserInfo2>{
public GetUserInfo(n: number): UserInfo2 {
let info = new UserInfo2();
info.name = "jianan";
info.age = 26;
return this.Search(info, n);
}
}
let ud = new UserData();
console.log(ud.GetUserInfo(1));