TypeScript学习(4)—泛型

泛型
泛型:软件工程中,不仅要创建一致的定义良好的API,同时也要考虑可重用性,组件不仅能够支持当前的数据类型,同时也能支持未来的数据类型,这在创建大型系统时提供了十分灵活的功能。

在像c#和java这样的语言中,可以使用泛型来创建可重用的组件,一个组件可以支持多种类型的数据,这样用户就能用自己的数据类型来使用组件。

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

泛型函数

// 普通的对不同类型函数的实现
// 对每个类型都实现一遍函数 或 用any数据类型
function getDate(value:any):any {}
// 缺点:any放弃了类型检查,且对要求传入什么,返回什么的情况不可以
// 因为使用any就说明传入的参数类型和返回的参数类型可以不一致

// 泛型可以支持不特定的数据类型
// T 表示泛型,具体什么类型是调用这个方法时决定的
// 1. 传入什么,返回什么
function getDate<T>(value:T):T {
	return value;
}
getDate<number>(123)	// 正确
getDate<string>('123')	// 错误

// 2. 用any表示可以返回任意类型
function getDate<T>(value:T):any {
	return value;
}

泛型类

比如有个最小堆算法,需要同时支持返回数字和字符串两种类型,通过类的泛型实现。

class MinClass<T> {
	public list:T[] = []
	add(num:T):void {
		this.list.push(num)
	}
	min():T {
		var minNum = this.list[0]
		for(var i = 0; i < this.list.length; i++) {
			if(minNum > this.list[i]) {
				minNum = this.list[i]
			}
		}
		return minNum;
	}
}

泛型接口

// 1. 定义泛型接口方法一
interface ConfigFn {
	<T>(value:T):T;
}
var getData:ConfigFn = function<T>(value:T):T {
	return value;
}
getData<string>('zhangsan')

// 2. 方法二
// 二者区别主要是在写法上,本质上是一样的
interface ConfigFn<T> {
	(value:T):T;
}
function getData<T>(value:T):T {
	return value
}
var myGetData:ConfigFn<string> = getData

泛型类

泛型类:把类当作参数的泛型类

  1. 定义个类
  2. 把类作为参数来约束数据传入的类型
// 定义一个User类,作用是映射数据库字段
// 然后定义一个mysalDb的类,作用是操作数据库
// 再把User类作为参数传入到mysqlDb中

// 定义要作为参数传入的类
class User {
	username: string | undefined;
	password: string
}
// 定义接收类传入的泛型类
class MysqlDb<T> {
	add(info:T):boolean {
		retrun true
	}
}

var user = new User({
	username: 'zhangsan',
	password: '123'
})
// 用<User>进行类型校验
var Db = new MysqlDb<User>()
Db.add(user)
posted @ 2021-07-21 20:05  月光小提琴  阅读(38)  评论(0)    收藏  举报