TypeScript深度剖析:TypeScript 中泛型的理解?应用场景?

news2024/11/18 17:35:48

一、是什么

泛型程序设计(generic programming)是程序设计语言的一种风格或范式

泛型允许我们在强类型程序设计语言中编写代码时使用一些以后才指定的类型,在实例化时作为参数指明这些类型 在typescript中,定义函数,接口或者类的时候,不预先定义好具体的类型,而在使用的时候在指定类型的一种特性

假设我们用一个函数,它可接受一个 number 参数并返回一个 number 参数,如下写法:

function returnItem (para: number): number {
    return para
}

如果我们打算接受一个 string 类型,然后再返回 string类型,则如下写法:

function returnItem (para: string): string {
    return para
}

上述两种编写方式,存在一个最明显的问题在于,代码重复度比较高

虽然可以使用 any类型去替代,但这也并不是很好的方案,因为我们的目的是接收什么类型的参数返回什么类型的参数,即在运行时传入参数我们才能确定类型

这种情况就可以使用泛型,如下所示:

function returnItem<T>(para: T): T {
    return para
}

可以看到,泛型给予开发者创造灵活、可重用代码的能力

二、使用方式

泛型通过<>的形式进行表述,可以声明:

  • 函数
  • 接口

函数声明

声明函数的形式如下:

function returnItem<T>(para: T): T {
    return para
}

定义泛型的时候,可以一次定义多个类型参数,比如我们可以同时定义泛型 T 和 泛型 U

function swap<T, U>(tuple: [T, U]): [U, T] {
    return [tuple[1], tuple[0]];
}

swap([7, 'seven']); // ['seven', 7]

接口声明

声明接口的形式如下:

interface ReturnItemFn<T> {
    (para: T): T
}

那么当我们想传入一个number作为参数的时候,就可以这样声明函数:

const returnItem: ReturnItemFn<number> = para => para

类声明

使用泛型声明类的时候,既可以作用于类本身,也可以作用与类的成员函数

下面简单实现一个元素同类型的栈结构,如下所示:

class Stack<T> {
    private arr: T[] = []

    public push(item: T) {
        this.arr.push(item)
    }

    public pop() {
        this.arr.pop()
    }
}

使用方式如下:

const stack = new Stacn<number>()

如果上述只能传递 string 和 number 类型,这时候就可以使用 <T extends xx> 的方式猜实现约束泛型,如下所示:

除了上述的形式,泛型更高级的使用如下:

例如要设计一个函数,这个函数接受两个参数,一个参数为对象,另一个参数为对象上的属性,我们通过这两个参数返回这个属性的值

这时候就设计到泛型的索引类型和约束类型共同实现

索引类型、约束类型

索引类型 keyof T 把传入的对象的属性类型取出生成一个联合类型,这里的泛型 U 被约束在这个联合类型中,如下所示:

function getValue<T extends object, U extends keyof T>(obj: T, key: U) {
  return obj[key] // ok
}

上述为什么需要使用泛型约束,而不是直接定义第一个参数为 object类型,是因为默认情况 object 指的是{},而我们接收的对象是各种各样的,一个泛型来表示传入的对象类型,比如 T extends object

使用如下图所示:

多类型约束

例如如下需要实现两个接口的类型约束:

interface FirstInterface {
  doSomething(): number
}

interface SecondInterface {
  doSomethingElse(): string
}

可以创建一个接口继承上述两个接口,如下:

interface ChildInterface extends FirstInterface, SecondInterface {

}

正确使用如下:

class Demo<T extends ChildInterface> {
  private genericProperty: T

  constructor(genericProperty: T) {
    this.genericProperty = genericProperty
  }
  useT() {
    this.genericProperty.doSomething()
    this.genericProperty.doSomethingElse()
  }
}

通过泛型约束就可以达到多类型约束的目的

三、应用场景

通过上面初步的了解,后述在编写 typescript 的时候,定义函数,接口或者类的时候,不预先定义好具体的类型,而在使用的时候在指定类型的一种特性的时候,这种情况下就可以使用泛型

灵活的使用泛型定义类型,是掌握typescript 必经之路

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/398264.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一文快速入门 HTML 网页基础

专栏简介: 前端从入门到进阶 题目来源: leetcode,牛客,剑指offer. 创作目标: 记录学习JavaEE学习历程 希望在提升自己的同时,帮助他人,,与大家一起共同进步,互相成长. 学历代表过去,能力代表现在,学习能力代表未来! 目录 1.HTML 结构 1.1. 认识 HTML 标签 1.2 HTML 文件结构…

[MySQL核心]1.表操作

MySQL核心--表操作表操作一表操作二&#xff08;CRUD操作&#xff09;表操作一 创建表 比较规范的写法&#xff0c;关键字应该要大写&#xff0c;其他比如表名&#xff0c;字段这些自定义的可以小写 ENGINEINNODB DEFAULT CHARSETutf8 指定存储引擎以及默认的字符集&#xff0c…

04-CSS

一、其他样式 1、圆角边框在 CSS3 中&#xff0c;新增了圆角边框样式&#xff0c;这样我们的盒子就可以变圆角了。border-radius 属性用于设置元素的外边框圆角。语法&#xff1a;border-radius:length;参数值可以为数值或百分比的形式如果是正方形&#xff0c;想要设置为一个圆…

IBM ILOG CPLEX Optimization Studio 22.1 Crack

BM ILOG CPLEX 优化工作室 建立和解决复杂的优化模型以确定最佳行动 通过数据科学改变您的业务决策 IBM ILOG CPLEX Optimization Studio 使用决策优化技术来优化您的业务决策&#xff0c;快速开发和部署优化模型&#xff0c;并创建可显着改善业务成果的真实应用程序。 如何&…

ROS 摄像头的使用

参考&#xff1a; ​ youtubeArticulated Robotics ​ 作者Josh Newans博客 建议&#xff1a; 这个只是我的看法&#xff0c;强烈建议看原视频或博客 png&#xff1a;无损压缩 jpeg&#xff1a;有损压缩 Driver Node 负责连接硬件设备&#xff0c;读取摄像头数据"ima…

Learning C++ No.13【STL No.3】

引言&#xff1a; 北京时间&#xff1a;2023/3/7/15:33&#xff0c;还有27分钟就要去上课啦&#xff01;刚刚把最近因为考试原因欠的课给还干净了&#xff0c;已经准备好今天晚上接受航哥的毒打了&#xff0c;毒打就毒打&#xff0c;咱不怕&#xff0c;只要不欠钱&#xff0c;…

小黑子—Java从入门到入土过程:第一章

Java零基础入门1.0Java系列第一章1. cmd2. 利用cmd打开qq并配置环境变量3. Java概述和学习方法4. JDK下载和安装5. hello world 小案例6. bug常见小问题7. 环境变量8. Notepad9. java 语言的发展10. java 能干什么10.1 javaSE10.2 javaME10.3 javaEE11. java为什么火12. java为…

什么是激励能力?HR人才测评

什么是激励能力&#xff1f;激励能力主要是针对管理型岗位而言的&#xff0c;尤其是团队型管理&#xff0c;既要督导团队成员&#xff0c;更需要掌握激励下属的方法和技巧。在HR人才测评系统中&#xff0c;对于管理型岗位的人才测评指标&#xff0c;通常也会包含激励能力&#…

蓝牙耳机哪款佩戴舒服?2023佩戴最舒适蓝牙耳机

由于每天坐在电脑桌前的时间比较长&#xff0c;需要音乐和运动调剂一下自己&#xff0c;而说到与蓝牙耳机&#xff0c;大家更加关注的是音质和佩戴舒适度吧&#xff0c;作为一位音乐发烧友&#xff0c;使用过的耳机数不胜数&#xff0c;接下来跟大家分享一下我的体验感受。 第…

关于供应链,一文教你全面了解什么是供应链

什么是供应链&#xff1f;供应链是指产品生产和流通过程中所涉及的原材料供应商、生产商、分销商、零售商以及最终消费者等成员通过与上游、下游成员的连接 (linkage) 组成的网络结构。也即是由物料获取、物料加工、并将成品送到用户手中这一过程所涉及的企业和企业部门组成的一…

CH4-流程控制之for循环结构: 打印三3种三角形图案(代码+详细注释+知识点总结

建议学习方法&#xff1a;不会可以参考代码和视频进行学习&#xff0c;学会举一反三&#xff0c;三角形很多种变形题目&#xff0c;学会自己敲代码&#xff1b; 本文章内容建议参考后&#xff0c;自己默写和理解敲代码&#xff01;不要偷懒哦&#xff01; 刚刚起步&#xff0c;…

AM5728(AM5708)开发实战之调试DP83822 LED

一 LED寄存器分析 MLEDCR即Multi-LED Control Register,地址为0x0025 MLEDCR[1:0]设置MLED路由功能,具体如下所示: 0x00表示MLED功能路由到COL(PIN29) 0x03表示MLED功能路由到LED_0(PIN17) 从上述信息可知,DP83822芯片只有COL(PIN29)和LED_0(PIN17)才可以配置成MLED功能 …

手把手演示Ngnix+Tomcat实现动静分离

前言 大家好&#xff0c;又见面了&#xff0c;我是沐风晓月&#xff0c;本文首发于csdn作者:我是沐风晓月 的【运维系列-系统服务与架构】专栏&#xff0c;专栏还在持续更新中&#xff0c;欢迎关注。 此专栏是沐风晓月对操作系统中常见的服务进行总结&#xff0c;希望能够加深…

【专项训练】泛型递归、树的递归

递归和循环没有明显的边界! 不要进行人肉递归! 找最近重复子问题,直接写递归! 数学归纳法思维:1,2,…… 70. 爬楼梯 https://leetcode.cn/problems/climbing-stairs/ 互斥,且加在一起是全部答案! 动态规划法:用数组做递推,就是动态规划!!! class Solution

k8s-Kubernetes--pod管理-基本操作

文章目录前言一、简介一些简单的入门小命令二、pod基本操作1.pod创建2.pod删除&#xff0c;查看日志三、service和deployment(控制器)1.deployment基本操作2.Pod扩容与缩容3.expose暴露端口3.1ClusterIP默认类型暴露端口3.2 NodePort类型暴露端口4.升级pod镜像/应用版本5.回滚6…

萤火虫算法优化SVM变压器故障分类预测,fa-svm分类预测,libsvm参数优化

目录 支持向量机SVM的详细原理 SVM的定义 SVM理论 Libsvm工具箱详解 简介 参数说明 易错及常见问题 SVM应用实例,基于fa-svm分类预测 代码 结果分析 展望 支持向量机SVM的详细原理 SVM的定义 支持向量机(support vector machines, SVM)是一种二分类模型,它的基本模型是…

Android Studio无法启动,Failed to create JVM:error code -1. JVM Path 完美解决方案

一、背景 很久没有启动过Android studio了,今天突然需要,却打不开了,报错如下,因此记录下我的解决办法,希望能帮到更多朋友! 二、过程 刚开始以为时java的环境变量问题,配置好java环境变量依然不行,所以大家不必折腾了。 后面经过一片博文的启发,https://blog.csdn.ne…

信息系统分析与设计——信息、管理与信息系统

&#x1f31f;所属专栏&#xff1a;信息系统分析与设计&#x1f414;作者简介&#xff1a;rchjr——五带信管菜只因一枚&#x1f62e;前言&#xff1a;该系列将持续更新信息系统分析与设计课程的相关学习笔记&#xff0c;欢迎和我一样的小白订阅&#xff0c;一起学习共同进步~&…

SpringBoot学习笔记(四)Web开发

在之前我们的项目都是以jar包结尾的&#xff0c;没有放webapp的地方。springboot最大的特点&#xff1a;自动装配&#xff0c;创建应用&#xff0c;选择模块导入starter&#xff0c;只需要专注于业务代码springboot到底帮我们配置了什么&#xff0c;我们能不能修改&#xff1f;…

【微信小程序】-- 案例 - 本地生活(列表页面)(三十)

&#x1f48c; 所属专栏&#xff1a;【微信小程序开发教程】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &…