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
泛型类
泛型类:把类当作参数的泛型类
- 定义个类
- 把类作为参数来约束数据传入的类型
// 定义一个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)
浙公网安备 33010602011771号