【TypeScript】TypeScript中的泛型

2023-11-12

泛型的意义及语法

定义一个函数或类时,有些情况下无法确定其中要使用的具体类型(返回值、参数、属性的类型不能确定),此时泛型便能够发挥作用。

  • 举个例子:

    • function test(arg: any): any{
      	return arg;
      }
      
    • 上例中,test函数有一个参数类型不确定,但是能确定的时其返回值的类型和参数的类型是相同的,由于类型不确定所以参数和返回值均使用了any,但是很明显这样做是不合适的,首先使用any会关闭TS的类型检查,其次这样设置也不能体现出参数和返回值是相同的类型

    • 使用泛型:

    • function test<T>(arg: T): T{
      	return arg;
      }
      
    • 这里的<T>就是泛型,T是我们给这个类型起的名字(不一定非叫T),设置泛型后即可在函数中使用T来表示该类型。所以泛型其实很好理解,就表示某个类型。

    • 那么如何使用上边的函数呢?

      • 方式一(直接使用):

        • test(10)
          
        • 使用时可以直接传递参数使用,类型会由TS自动推断出来,但有时编译器无法自动推断时还需要使用下面的方式

      • 方式二(指定类型):

        • test<number>(10)
          
        • 也可以在函数后手动指定泛型

    • 可以同时指定多个泛型,泛型间使用逗号隔开:

      • function test<T, K>(a: T, b: K): K{
            return b;
        }
        
        test<number, string>(10, "hello");
        
      • 使用泛型时,完全可以将泛型当成是一个普通的类去使用

    • 类中同样可以使用泛型:

      • class MyClass<T>{
            prop: T;
        
            constructor(prop: T){
                this.prop = prop;
            }
        }
        
    • 除此之外,也可以对泛型的范围进行约束

      • interface MyInter{
            length: number;
        }
        
        function test<T extends MyInter>(arg: T): number{
            return arg.length;
        }
        
      • 使用T extends MyInter表示泛型T必须是MyInter的子类,不一定非要使用接口类和抽象类同样适用。

复杂例子:可扩展的数据结构

现在让我们看一个更复杂的例子,使用泛型创建一个可扩展的数据结构。假设我们要实现一个Stack(栈)数据结构,它可以存储不同类型的元素。下面是使用泛型实现的Stack类:

class Stack<T> {
  private items: T[] = [];

  push(item: T): void {
    this.items.push(item);
  }

  pop(): T | undefined {
    return this.items.pop();
  }

  isEmpty(): boolean {
    return this.items.length === 0;
  }
}

// 使用泛型类
const stack = new Stack<number>();
stack.push(1);
stack.push(2);
stack.push(3);

while (!stack.isEmpty()) {
  console.log(stack.pop()); // 输出:3, 2, 1
}

在上面的例子中,我们使用泛型类Stack来创建一个可以存储不同类型元素的栈。通过使用泛型,我们可以在创建Stack实例时指定具体的元素类型。这使得我们可以在同一个栈中存储不同类型的数据,并保持类型安全。

例子出处

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

【TypeScript】TypeScript中的泛型 的相关文章

随机推荐

  • 编译cryptopp库

    1 下载源码 网址 https github com golang crypto git 2 打开里面的cryptest sln 如下图 3 打开后如下图所示 4 接着邮件crptlib属性 修改内容如下所示 release版本改为如下 对
  • 【知识点】eval() 的用法

    目录 一 基本知识 二 具体实例 三 项目应用 总结 一 基本知识 返回传入字符的表达式的结果 即将字符串当成有效的表达式 进行运算 求值并返回结果 从某种意义上说 eval就是实现list dict tuple和 str 之间的相互转换
  • cookie、session以及token的定义、区别、使用环境

    Cookie Cookie 的工作原理 由于 HTTP 是一种无状态的协议 服务器单从网络连接上无从知道客户身份 怎么办呢 就给客户端们颁发一个通行证吧 每人一个 无论谁访问都必须携带自己通行证 这样服务器就能从通行证上确认客户身份了 这就
  • 一个按键控制数码管的开和关_按键控制数码管显示

    功能 按键查询控制数码管显示的数据 定时器中断控制数码管扫描显示 所用器件 STC12C5A32S2 include config h define uint unsigned int define uchar unsigned char
  • 2021-08-12 一阶系统的频率响应 低通滤波器

  • 深入浅出PID控制算法(三)————增量式与位置式PID算法的C语言实现与电机控制经验总结

    前文对PID算法离散化和增量式PID算法原理进行来探索 之后又使用Matlab进行了仿真实验 对PID三个参数又有了更深入的认识 接下来我们来使用C语言进行PID算法实现 并且结合控制电机的项目来深入学习 1 PID 算法C 语言原代码 先
  • [BJDCTF2020]EasySearch1

    BJDCTF2020 EasySearch1 0x01漏洞类型 打开题目如图所示 还是对CTF套路不太熟悉 拿到这种就以为是sql注入 启动sqlmap就一顿操作 都大 了 搞竞赛还来得及吗 参考别人的wp后知道是源码泄露 这里就不给服务器
  • QT中监控全局键盘鼠标事件

    先介绍一下在单一Widget等控件中监听鼠标键盘事件的代码 void mouseMoveEvent QMouseEvent event void mouseReleaseEvent QMouseEvent event void keyPre
  • CNN代码系列之训练源文件及头文件(二)

    本博客为CNN卷积代码系列之训练源文件及头文件 注意 本博客是系列博客 请链接上一博客http blog csdn net samylee article details 69325368 训练主程序中的头文件 funset hpp ifn
  • 半路出家OCR后成领域专家,白翔:计算机视觉科研没有捷径

    极市学者专访 第三期 听大牛说说计算机视觉那些事儿 AI派在读学生小姐姐Beyonce Java实战项目练习群 长按识别下方二维码 按需求添加 扫码添加Beyonce小姐姐 扫码关注 进Java学习大礼包 本次极市学者访谈 我们非常荣幸地邀
  • WebSSH2 界面ssh

    工具 Virtual Machines14 1 系统环境 CentOS 7 64位 2个 IP 192 168 163 138 IP 192 168 163 141 概述 在138系统中安装部署WebSSH服务 通过浏览器 http Web
  • [SLAM四元数基础系列一] 四元数定义 Hamilton vs JPL

    四元数定义 Hamilton vs JPL 简介 四种区分方式 Hamilton vs JPL 引用 不管是卡尔曼滤波或者BA优化形式的SLAM或者VIO系统中 都需要用到单位四元数 Quaternion 来表示旋转 主要是单位四元数表示旋
  • Python内置函数(47)——open

    英文文档 open file mode r buffering 1 encoding None errors None newline None closefd True opener None Open file and return a
  • VB 正则表达式(RegExp)对象

    VB 正则表达式 RegExp 对象 正则表达式 RegExp 对象提供简单的正则表达式支持功能 说明下面的代码说明了RegExp对象的用法 Function RegExpTest patrn strng Dim regEx Match M
  • Docker swarm 搭建docker高可用集群

    目录 项目名称 基于docker swarm 搭建docker高可用集群 1 网络拓扑图 网络数据流图 2 项目环境 3 项目描述 4 项目步骤 1 规划设计整个集群的架构 网络拓扑 安装7台CentOS 7 6的系统 按照规划配置好每台l
  • rs232转usb驱动_世界上最小的伺服驱动器。

    PEAR 世界上最小的伺服驱动器 用于有刷和无刷电机的微型嵌入式控制器 8 40 Vdc单电源 3 A连续 6 A峰值 CANOpen DS402 DS301 RS232和USB配置 数字霍尔 单端编码器 2x通用输入 1x数字输出尺寸 2
  • dw1000 配置无法通过

    最近在使用DW1000 做UWB项目时 出现过一个问题 配置DW1000一直无法成功 奇怪 之前还好好的 一点点排查确认了SPI配置没有问题 速度也不会太高 最后发现是重新配置工程时错将DW1000的RESET引脚配成输出引脚 把它改回输入
  • TCP的三次握手,四次挥手,面试必会

    目录 一 TCP三次握手 建立连接 二 TCP三次握手细节 三 TCP 四次挥手 断开连接 四 TCP非常重要的协议 一 TCP三次握手 建立连接 握手 单纯就是发一个打招呼的数据 不携带业务信息 那么为什么叫三次握手呢 因为B的中间两次可
  • C++ map的基本操作和使用

    C map的基本操作和使用 1 map简介 map是一类关联式容器 它的特点是增加和删除节点对迭代器的影响很小 除了那个操作节点 对其他的节点都没有什么影响 对于迭代器来说 可以修改实值 而不能修改key 2 map的功能 自动建立Key
  • 【TypeScript】TypeScript中的泛型

    泛型的意义及语法 定义一个函数或类时 有些情况下无法确定其中要使用的具体类型 返回值 参数 属性的类型不能确定 此时泛型便能够发挥作用 举个例子 function test arg any any return arg 上例中 test函数