泛型是在TypeScript之中很重要的东西,例如Vue3就是用TS编写的,里面用到了非常多的泛型

函数泛型

当有两个函数,一个是数字类的函数,一个是字符串类型的函数,这两个唯一的区别就是类型不同,但是所实现的功能是一样的,这个时候我们就可以使用泛型来进行优化

function num(a: number, b: number): Array<number> {return [a, b]
}
let res1 = num(1, 2)
console.log(res1)function str(a: string, b: string): Array<string> {return [a, b]
}
let res2 = str('a', 'b')
console.log(res2)

函数优化

语法:函数名字 + <参数名>

参数名可以随便写,我这里用T表示

当我们使用这个函数的时候,把参数的类型传过去就可以了(也就是动态类型)

function Add<T>(a: T, b: T): Array<T> {return [a, b]
}
Add<number>(1, 2)
Add<string>('a', 'b')

多个类型

function Add<T, U>(a: T, b: U): Array<T | U> {let arr: Array<T | U> = [a, b]return arr
}
let res = Add<number, boolean>(123456, false)
console.log(res)

泛型约束

我们期望在一个泛型的变量上面,获取其length参数,但是,有的数据类型是没有length属性的

function getLength<T>(arg: T) {return arg.length
}

这个时候系统就会告诉我们泛型T类型没有length属性,所以这个时候我们就要用到泛型interface泛型约束,代码如下:

interface Len {length: number
}
function getLength<T extends Len>(arg: T) {return arg.length
}
getLength('abcdefg')
// 传数字是不行的,因为数字没有length
// 传字符串是可以的,因为字符串有length
// 传数组,对象也是可以的,因为他们都有length
// 传布尔也不行,因为布尔也没有length

使用 keyof 约束对象

其中使用了TS的泛型和泛型约束。首先定义了T类型,并且使用extends关键字来继承object类型的子类型,然后使用keyof操作符获取T类型的所有键,它的返回类型是联合类型,最后利用extends关键字约束K类型必须为keyof T联合类型的子类型

function props<T, K extends keyof T>(obj: T, key: K) {return obj[key]
}
console.log(props({ a: 1, b: 2, c: 3, d: 4 }, 'a'))
// 这个时候,程序就会报错,因为不存在e
console.log(props({ a: 1, b: 2, c: 3, d: 4 }, 'e'))

泛型类

声明方法跟函数类似,名称后面定义<类型>

使用的时候确定类型new Sub<number>()

class Sub<T>{attr: T[] = []add(a: T): T[] {return [a]}
}
let n = new Sub<number>()
n.attr = [1, 2, 3]
n.add(123)let s = new Sub<string>()
s.attr = ['a', 'b', 'c']
s.add('abc')

TypeScript14 - 泛型相关推荐

  1. 【C#】集合_哈希表_字典_泛型_文件

    数组能做到:存放同种类型数据,且数据个数确定 object类型的数组能满足:放各种类型的数据,确定放多少个,但是随意插入元素,数组做不到 集合能做到:存放各种数据类型,且不确定存放多少个,能做到随意插 ...

  2. 2021年大数据常用语言Scala(三十六):scala高级用法 泛型

    目录 泛型 定义一个泛型方法 定义一个泛型类 上下界 协变.逆变.非变 非变 协变 逆变 泛型 scala和Java一样,类和特质.方法都可以支持泛型.我们在学习集合的时候,一般都会涉及到泛型. sc ...

  3. 对比两个同类型的泛型集合并返回差异泛型集合 ——两个List类名的比较

    1: /// <summary> 2: /// 对比两个同类型的泛型集合并返回差异泛型集合 3: /// </summary> 4: /// <typeparam nam ...

  4. 利用委托和泛型实现树的常用操作

    在日常开发中,经常遇到对树的操作,我们可以利用泛型和委托对这些树进行操作,这样就不需要每有一个树就要实现相应的功能了. 源码在http://files.cnblogs.com/haiconc/Lang ...

  5. java 泛型 父子,Java泛型-mb601cf8a78cc07的博客-51CTO博客

    Java泛型 泛型类 即把不确定的数据元素类型用一个泛型占位符表示@Data public class Person { private T name; private T address; }Per ...

  6. java 泛型 .net_Java基础11:Java泛型详解

    本文对java的泛型的概念和使用做了详尽的介绍. 本文参考https://blog.csdn.net/s10461/article/details/53941091 具体代码在我的GitHub中可以找 ...

  7. java 获取泛型的type,如何获取泛型的Type类型

    开发中很多时候都遇到或使用到泛型.例如在json转换成bean对象或其他对象,而对象中存在泛型,这时候需要用到TypeToken. Type:是java里的 java.lang.reflect.Typ ...

  8. Java中创建泛型数组

    Java中创建泛型数组 使用泛型时,我想很多人肯定尝试过如下的代码,去创建一个泛型数组 T[] array = new T[]; 当我们写出这样的代码时编译器会报Cannot create a gen ...

  9. 第八章 泛型程序设计

    1.带有[超类型限定 super]的通配符可以向泛型对象写入,带有[子类型限定 extends]的通配符可以从泛型对象读取,反之则不然. 转载于:https://www.cnblogs.com/bao ...

最新文章

  1. 0730------Linux网络编程----------服务器端模型(迭代,多进程,多线程,select,poll,epoll 等)...
  2. idea + Maven + Spring + myBatis的单元测试
  3. 错误: 找不到或无法加载主类 org.apache.hadoop.mapreduce.v2.app.MRAppMaster
  4. C# : 调用C++动态库(dll)
  5. 全国胸最小的省是哪个,你知道吗?| 今日最佳
  6. Linux调优(文件系统)
  7. 商场楼层导视牌图片_百宝图商场电子导视软件中预约产品功能简介
  8. mybatis中修改了数据,控制台显示成功,数据库没有修改
  9. 让SecureCRT vi中显示多色彩
  10. 在mc中直接加aswing组件,该组件还需最后用validate()方法
  11. java网上书店模板_网上书店静态网站模板
  12. 熟悉VB 6.0界面
  13. 一款不错的工具:aardio
  14. win10网络诊断为DNS服务器未响应,Win10系统下电脑无法连接网络诊断提示DNS服务器未响应解决方法...
  15. 【PID优化】基于正余弦算法 (SCA)优化PID实现微型机器人系统位置控制附simulink模型和matlab代码
  16. 理解Linux中的进程状态
  17. mysql联合union查询_Mysql联合查询UNION和UNION ALL的使用介绍
  18. 利用clipboardJs 点击按钮复制文本
  19. HTML旅游网页设计制作 DW旅游网站官网滚动网页 DIV旅游风景介绍网页设计与实现...
  20. 高等数学(上)知识点总结

热门文章

  1. 关于:-1: error: collect2.exe: error: ld returned 1 exit status和The process was ended forcefully.解决方法
  2. Mysql 中的日期时间函数汇总
  3. Tomcat9.0.13 Bug引发的java.io.IOException:(打开的文件过多 Too many open files)导致服务假死...
  4. Centos升级助手
  5. 了解面部识别的不同算法
  6. Docker入门-什么是Docker
  7. [原创]插卡路由器对接openwrt对接国内节点 手机免流通过USB口共享流量给路由器教程
  8. 性能监控-软中断出现瓶颈的查看方式
  9. linux qt控件大全,Qt实现复杂的列表控件
  10. 游戏陪玩平台源码开发,依赖收集和触发的实现