泛型工程中,我们不仅要创建一致的定义良好的api,同时也要考虑可重用性,组件不仅能够支持当前的数据类型,同时也能支持未来的数据类型,这在创建大型系统时为你提供了十分灵活的功能
泛型: 解决了类、方法、接口的复用性、以及对不特定数据类型的支持
1、同时返回string 类型和 number 类型以及any的利和弊(回顾)
function run1 (value:number):number {
return value
}
run1(911)
run1('911') // 错误
function run2 (value:string):string {
retrun value
}
run1(911) // 错误
run1('911')
function run3 (value:any):any{
retrun value
}
run1(911)
run1('911') // 都正确
2、泛型函数:可以支持不特定类型的数据,要求:传入的参数和返回的参数一致
function run<T>(value:T):T {
retrun value
}
run<string>('911')
run<string>(911) // 错误
备注:指定数据类型为string,函数传入值得类型必须是字符串
3、泛型类
// 定义一个calculation的泛型类
class calculation<T> {
list:T[] = []
ctr(num:T){
this.list.push(num)
}
add() {
let min = this.list[0]
for (let i = 1; i < this.list.length; i++) {
if (min < this.list[i]) {
min = this.list[i]
}
}
return min
}
}
var calTion = new calculation<number>()
calTion.ctr(1)
calTion.ctr(13)
calTion.ctr(31)
console.log(calTion.add())
4、泛型接口 泛型类接口
// 方法1
interface configApi {
<T>(value:T):T
}
var run:configApi = function<T>(value:T):T {
retrun value
}
run<string>('911')
run<number>('911') // 错误
// 方法2
interface configApi<T> {
(value:T):T
}
function get<T>(value:T):T {
return value
}
var newGet:configApi<string> = get
newGetData<strimg>('911')
newGetData<strimg>(911) // 错误
5、泛型类,把类作为参数类型的泛型类
class user {
name:string | undefined;
password: string | undefined
constructor(params:{
name:string | undefined;
password: string | undefined
}) {
this.name = params.name
this.password = params.password
}
}
class mySql<T> {
add(info:T) {
console.log(info)
}
updated() {
}
}
var us = new user({
name:'zhangsan',
password: '123456'
})
var my = new mySql<user>()
my.add(us)