Ts中泛型的使用

2023-10-31

泛型

指在定义函数、接口或类的时候,不预先指定具体的类型,而在使用的时候再指定具体类型的一种特性。

引入

下面创建一个函数, 实现功能: 根据指定的数量 count 和数据 value , 创建一个包含 count 个 value 的数组

不使用泛型

function createArray(value: any, count: number): any[] {
  const arr: any[] = []
  for (let index = 0; index < count; index++) {
    arr.push(value)
  }
  return arr
}

const arr1 = createArray(11, 3)
const arr2 = createArray('aa', 3)
console.log(arr1[0].toFixed(), arr2[0].split(''))

使用函数泛型

function createArray2 <T> (value: T, count: number) {
  const arr: Array<T> = []
  for (let index = 0; index < count; index++) {
    arr.push(value)
  }
  return arr
}
const arr3 = createArray2<number>(11, 3)
console.log(arr3[0].toFixed())
// console.log(arr3[0].split('')) // error
const arr4 = createArray2<string>('aa', 3)
console.log(arr4[0].split(''))
// console.log(arr4[0].toFixed()) // error

多个泛型参数的函数

function swap <K, V> (a: K, b: V): [K, V] {
  return [a, b]
}
const result = swap<string, number>('abc', 123)
console.log(result[0].length, result[1].toFixed())

泛型接口

在定义接口时, 为接口中的属性或方法定义泛型类型
在使用接口时, 再指定具体的泛型类型

interface IbaseCRUD <T> {
  data: T[]
  add: (t: T) => void
  getById: (id: number) => T
}

class User {
  id?: number; //id主键自增
  name: string; //姓名
  age: number; //年龄

  constructor (name, age) {
    this.name = name
    this.age = age
  }
}

class UserCRUD implements IbaseCRUD <User> {
  data: User[] = []
  
  add(user: User): void {
    user = {...user, id: Date.now()}
    this.data.push(user)
    console.log('保存user', user.id)
  }

  getById(id: number): User {
    return this.data.find(item => item.id===id)
  }
}


const userCRUD = new UserCRUD()
userCRUD.add(new User('tom', 12))
userCRUD.add(new User('tom2', 13))
console.log(userCRUD.data)

泛型类

在定义类时, 为类中的属性或方法定义泛型类型 在创建类的实例时, 再指定特定的泛型类型

class GenericNumber<T> {
  zeroValue: T
  add: (x: T, y: T) => T
}

let myGenericNumber = new GenericNumber<number>()
myGenericNumber.zeroValue = 0
myGenericNumber.add = function(x, y) {
  return x + y 
}

let myGenericString = new GenericNumber<string>()
myGenericString.zeroValue = 'abc'
myGenericString.add = function(x, y) { 
  return x + y
}

console.log(myGenericString.add(myGenericString.zeroValue, 'test'))
console.log(myGenericNumber.add(myGenericNumber.zeroValue, 12))

泛型约束

如果我们直接对一个泛型参数取 length 属性, 会报错, 因为这个泛型根本就不知道它有这个属性

// 没有泛型约束
function fn <T>(x: T): void {
  // console.log(x.length)  // error
}
我们可以使用泛型约束来实现

interface Lengthwise {
  length: number;
}

// 指定泛型约束
function fn2 <T extends Lengthwise>(x: T): void {
  console.log(x.length)
}
我们需要传入符合约束类型的值,必须包含必须 length 属性:

fn2('abc')
// fn2(123) // error  number没有length属性
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Ts中泛型的使用 的相关文章

随机推荐

  • Makefile 中gcc -lm -ldl是什么意思?

    gcc lm ldl是什么意思 包含动态链接库 到书上出现gcc lm 的选项 甚是不解 在网上查阅了一些资料 访问了一些论坛整理下 初学linux和gcc C代码调用math h中的函数有问题 如sqrt函数 若如sqrt 3 0 则可以
  • ros-sensor_msgs::PointCloud2类型消息解读

    ROS中sensor msgs PointCloud2类型消息解读 实例 header seq 2116 stamp secs 1586919439 nsecs 448866652 frame id LidarSensor1 height
  • Kubernetes系列(二)架构及特性

    在了解了k8s的发展历程之后 正式进入到学习k8s的阶段 本文主要内容是K8S的整体架构的说明和K8S一些特性的概括 架构 如下图是K8S的整体架构图 Kubernetes属于主从分布式架构 主要由Master Node和Worker No
  • 线程中捕获异常

    总结 正常线程抛出异常时 在外部是捕捉不到的 当此类异常跑抛出时 线程就会终结 而对于主线程和其他线程完全不受影响 且完全感知不到某个线程抛出的异常 也是说完全无法catch到这个异常 解决方案 为线程添加未捕获异常处理器 Uncaught
  • 关于错误 TypeError: ‘list‘ object is not callable 的解决办法

    在使用类型转换的过程中 运行以下代码产生了错误 1 tuple 将一个序列转换成元组 list 10 20 30 tuple tuple list print tuple print type tuple 2 list 将一个序列转换成列表
  • ip68能达到什么程度防水_IP68级防水能防多少米

    IPX8级防水8是厂商自定义的 具体防水深度由客户根据对自身产品的了解以及要求而定 IP68是连接器防水等级标准的最高级别 大家都知道 看防水连接器防水性能如何 主要看IPXX的后面两位数字XX 第一位X是从0到6 最高等级为6 第2位X是
  • ERROR Fatal error during KafkaServer startup. Prepare to shutdown (kafka.server.KafkaServer) kafka.c

    kafka启动时报错如下 2021 12 28 23 35 02 165 ERROR Fatal error during KafkaServer startup Prepare to shutdown kafka server Kafka
  • 必须收藏!Node.js下载(全版本秒下载!)

    全版本都有包含 windows Linux 源码等 根据文件夹名称进行挑选 下载 网址 https nodejs org dist 如何解决了您的问题 欢迎关注我 还希望来JAVA WEB开发交流群 958923746 有问题欢迎共享 共同
  • GTSRB数据集

    GTSRB数据集数据集XML格式现已整理完毕
  • matlab经验模态分解代码_Matlab中的模态分析

    频响函数FRF是如何得这个问题很难吗 回忆了一下 其实对新手来说确实蛮难的 虽然课本上将了一堆模态分析 但是我们都是用较为成熟的商业软件进行 只需要对软件 点点点 即可 勒博其实为此困扰过很久 今天勒博就简单讲讲我们一般说的模态分析 1 勒
  • 互联网金融青年会成立一周年庆典在京举办

    2015年11月15日 互联网金融 北京 高峰论坛暨互联网金融青年会成立一周年庆典在京举办 2015年是互联网金融发展历程中颇具意义的一年 随着行业指导意见的发布 监管框架越来越明晰 在互联网金融即将告别无序进入有序的当下 本次活动以 路越
  • 机器学习——数据探索大致流程

    什么是EDA 在拿到数据后 首先要进行的是数据探索性分析 Exploratory Data Analysis 它可以有效的帮助我们熟悉数据集 了解数据集 初步分析变量间的相互关系以及变量与预测值之间的关系 并且对数据进行初步处理 如 数据的
  • 卷积和积分运算

    先看到卷积运算 知道了卷积就是把模版与图像对应点相乘再相加 把最后的结果代替模版中心点的值的一种运算 但是 近来又看到了积分图像的定义 立马晕菜 于是整理一番 追根溯源一下吧 1 卷积图像 1 1 源头 首先找到了一篇讲解特别好的博文 原文
  • 大学计算机高海波目录,华中师范大学

    个人简介 基本情况 性别 男 出生年月 1974年5月 籍贯 安徽省宿松县 职称 教授 研究方向 新闻传播史论 学历学位 博士研究生 工作单位 华中师范大学新闻传播学院 学习与工作经历 1993 9 1997 6 华中理工大学新闻系本科生
  • Linux环境中VScode无法进行函数跳转

    前言 我在Ubuntu中使用VScode阅读源码 发现无法进行函数跳转 查了很久 最后发现了一下原因 原因一 查看是否下载了clangd插件 原因二 查看是否关闭了intellisense 注意 必须是Disabled 而不是disable
  • 【深度学习与计算机视觉】6、图像分类与搜索

    文章目录 一 神经网络基础 从loss曲线和accuracy来判断如何调整训练参数 二 详解卷积操作 三 海洋鱼类分类 一 神经网络基础 从loss曲线和accuracy来判断如何调整训练参数 1 loss曲线 步长 学习率 batch s
  • 群晖服务器文件管理套件,群晖drive套件的使用教程

    摘要 群晖同步套件最近头脑一热组成了一台J3455的黑群晖1 安装群晖本站之前有分享相关的操作 https u nf za 45 htmlhttps u nf za 44 h 群晖同步套件 最近头脑一热组成了一台J3455的黑群晖 1 安装
  • leetcode第319场周赛

    T1 温度转换 这个题目就很简单 根据题意写代码即可 class Solution public vector
  • Vue实现TabBar底部导航栏灵活组件保姆级超详细

    Vue实现TabBar底部导航栏组件 标题项目介绍 需求 要求tabbar中的文字可动态更改 文字对应的图片动态更改动态增加 文字颜色对应更改 TabBarItem的图片动态更改和增加 整个项目灵活化 利用插槽 路由 父子组件的值传递 利用
  • Ts中泛型的使用

    泛型 指在定义函数 接口或类的时候 不预先指定具体的类型 而在使用的时候再指定具体类型的一种特性 引入 下面创建一个函数 实现功能 根据指定的数量 count 和数据 value 创建一个包含 count 个 value 的数组 不使用泛型