初识泛型

泛型的理解:“泛”理解为广泛的,不确定
“型”理解为ts类型
综合理解:不确定的(广泛的)类型
也可以理解为:根据一个值得到另一个值
泛型作用:复用

  1. function getMin<T>(arr:T[]): T{
  2. let min = arr[0]
  3. arr.forEach((item)=>{
  4. if(item<min){
  5. min = item
  6. }
  7. })
  8. return min
  9. }
  10. let min1 = getMin<number>([1,8,3,4,5])
  11. let min2 = getMin<number>(["a","bb","ccc","ddd"])
  12. console.log(min1,min2); // 打印出:1 "a"

泛型函数

非泛型函数:

  1. // 匿名函数写法
  2. let fun1:(str:number)=>number = function(str){
  3. return str
  4. }
  5. // 具名函数写法
  6. function fun1(str:number):number{
  7. return str
  8. }

泛型函数:

  1. // 匿名函数写法
  2. let fun2:<T>(str:T)=>T = function(str){
  3. return str
  4. }
  5. // 具名函数写法
  6. function fun2<T>(str:T):T{
  7. return str
  8. }

泛型类型参数可以有多个:

  1. // 匿名函数写法
  2. let fun3:<T,U>(first:T,last:U)=>T = function(first,last){
  3. return first
  4. }
  5. // 具名函数写法
  6. function fun3<T,U>(first:T,last:U):T{
  7. return first
  8. }

泛型函数对象字面量写法:

  1. // 匿名函数
  2. let fun4: {<T>(key:T):T} = function(key1){
  3. return key1
  4. }

泛型接口

写法一:不推荐,不明白调用函数时候具体传进去的泛型参数类型

  1. interface Fun{
  2. <T>(str:T):T
  3. }
  4. let fun6:Fun = function(str){
  5. return str
  6. }

写法二:推荐写法

  1. interface FunIn <T>{
  2. (key:T):T
  3. }
  4. let fun7:FunIn<number> = function(key){
  5. return key
  6. }

泛型类

语法格式:
class 类名{

}
new 类名<类型>

  1. // 泛型类
  2. class GetMin<T>{
  3. arr:T[] =[];
  4. add(key:T){
  5. this.arr.push(key)
  6. }
  7. min(): T{
  8. let minKey = this.arr[0]
  9. this.arr.forEach((ele)=>{
  10. if(minKey > ele){
  11. minKey = ele
  12. }
  13. })
  14. return minKey
  15. }
  16. }
  17. let obj = new GetMin<number>()
  18. obj.add(1)
  19. obj.add(3)
  20. obj.add(5)
  21. console.log(obj.min()); // 打印: 1
  22. let obj2 = new GetMin<string>()
  23. obj2.add('a')
  24. obj2.add('bb')
  25. obj2.add('c')
  26. console.log(obj2.min());// 打印:a

泛型约束

泛型的约束可以通过 interface接口 + extends 来实现约束

  1. // 泛型约束
  2. interface Len{
  3. length:number
  4. }
  5. function fun<T extends Len>(arg:T){
  6. return arg.length
  7. }
  8. console.log(fun([1,2,3])); // 打印:3
  9. console.log(fun('abcd')); // 打印:4
  10. console.log(fun(1)); // 报错

上诉代码中,泛型参数T只能接受满足接口Len类型的,有length属性的数据,否则报错

案例

  1. 例子:框架中axios请求,指定的接口传输指定的参数 ```typescript import axios from ‘axios’ function request(url:T,obj:API[T]){ return axios.post(url,obj) }

// 作用:预先定义一些类型变量,给后边用 interface API{ ‘/course/buy’:{ id:number }, ‘/course/comment’:{ id:number, message:string } }

request(‘/course/buy’,{id:1}) request(‘/course/comment’,{id:1,message:’贼棒1’}) request(‘/course/comment’,{id:1,message:’贼棒2’})

  1. 2. 例子:泛型封装数据库
  2. 3. keyof 关键字、extends 来限制属性只能从指定接口里获取。
  3. ```typescript
  4. function getProperty<T, K extends keyof T>(o: T, name: K): T[K] {
  5. return o[name]
  6. }
  1. interface 极客时间课程 {
  2. 课程名字:string,
  3. 价格:number[],
  4. 受众:string,
  5. 讲师头像?:string|boolean,
  6. 获取口令():string
  7. }
  8. let vueCourse: 极客时间课程 = {
  9. 课程名字:'玩转Vue 3全家桶',
  10. 价格:[59,129],
  11. 受众: '前端小老弟',
  12. 讲师头像:false,
  13. 获取口令(){
  14. return 88
  15. }
  16. }
  17. function getProperty<某种类型, 某种属性 extends keyof 某种类型>(o: 某种类型, name: 某种属性): 某种类型[某种属性] {
  18. return o[name]
  19. }