TypeScript14 - 泛型
泛型是在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 - 泛型相关推荐
- 【C#】集合_哈希表_字典_泛型_文件
数组能做到:存放同种类型数据,且数据个数确定 object类型的数组能满足:放各种类型的数据,确定放多少个,但是随意插入元素,数组做不到 集合能做到:存放各种数据类型,且不确定存放多少个,能做到随意插 ...
- 2021年大数据常用语言Scala(三十六):scala高级用法 泛型
目录 泛型 定义一个泛型方法 定义一个泛型类 上下界 协变.逆变.非变 非变 协变 逆变 泛型 scala和Java一样,类和特质.方法都可以支持泛型.我们在学习集合的时候,一般都会涉及到泛型. sc ...
- 对比两个同类型的泛型集合并返回差异泛型集合 ——两个List类名的比较
1: /// <summary> 2: /// 对比两个同类型的泛型集合并返回差异泛型集合 3: /// </summary> 4: /// <typeparam nam ...
- 利用委托和泛型实现树的常用操作
在日常开发中,经常遇到对树的操作,我们可以利用泛型和委托对这些树进行操作,这样就不需要每有一个树就要实现相应的功能了. 源码在http://files.cnblogs.com/haiconc/Lang ...
- java 泛型 父子,Java泛型-mb601cf8a78cc07的博客-51CTO博客
Java泛型 泛型类 即把不确定的数据元素类型用一个泛型占位符表示@Data public class Person { private T name; private T address; }Per ...
- java 泛型 .net_Java基础11:Java泛型详解
本文对java的泛型的概念和使用做了详尽的介绍. 本文参考https://blog.csdn.net/s10461/article/details/53941091 具体代码在我的GitHub中可以找 ...
- java 获取泛型的type,如何获取泛型的Type类型
开发中很多时候都遇到或使用到泛型.例如在json转换成bean对象或其他对象,而对象中存在泛型,这时候需要用到TypeToken. Type:是java里的 java.lang.reflect.Typ ...
- Java中创建泛型数组
Java中创建泛型数组 使用泛型时,我想很多人肯定尝试过如下的代码,去创建一个泛型数组 T[] array = new T[]; 当我们写出这样的代码时编译器会报Cannot create a gen ...
- 第八章 泛型程序设计
1.带有[超类型限定 super]的通配符可以向泛型对象写入,带有[子类型限定 extends]的通配符可以从泛型对象读取,反之则不然. 转载于:https://www.cnblogs.com/bao ...
最新文章
- 0730------Linux网络编程----------服务器端模型(迭代,多进程,多线程,select,poll,epoll 等)...
- idea + Maven + Spring + myBatis的单元测试
- 错误: 找不到或无法加载主类 org.apache.hadoop.mapreduce.v2.app.MRAppMaster
- C# : 调用C++动态库(dll)
- 全国胸最小的省是哪个,你知道吗?| 今日最佳
- Linux调优(文件系统)
- 商场楼层导视牌图片_百宝图商场电子导视软件中预约产品功能简介
- mybatis中修改了数据,控制台显示成功,数据库没有修改
- 让SecureCRT vi中显示多色彩
- 在mc中直接加aswing组件,该组件还需最后用validate()方法
- java网上书店模板_网上书店静态网站模板
- 熟悉VB 6.0界面
- 一款不错的工具:aardio
- win10网络诊断为DNS服务器未响应,Win10系统下电脑无法连接网络诊断提示DNS服务器未响应解决方法...
- 【PID优化】基于正余弦算法 (SCA)优化PID实现微型机器人系统位置控制附simulink模型和matlab代码
- 理解Linux中的进程状态
- mysql联合union查询_Mysql联合查询UNION和UNION ALL的使用介绍
- 利用clipboardJs 点击按钮复制文本
- HTML旅游网页设计制作 DW旅游网站官网滚动网页 DIV旅游风景介绍网页设计与实现...
- 高等数学(上)知识点总结
热门文章
- 关于:-1: error: collect2.exe: error: ld returned 1 exit status和The process was ended forcefully.解决方法
- Mysql 中的日期时间函数汇总
- Tomcat9.0.13 Bug引发的java.io.IOException:(打开的文件过多 Too many open files)导致服务假死...
- Centos升级助手
- 了解面部识别的不同算法
- Docker入门-什么是Docker
- [原创]插卡路由器对接openwrt对接国内节点 手机免流通过USB口共享流量给路由器教程
- 性能监控-软中断出现瓶颈的查看方式
- linux qt控件大全,Qt实现复杂的列表控件
- 游戏陪玩平台源码开发,依赖收集和触发的实现