详解Typescript中的泛型

泛型

  • TypeScript 中,泛型Generics)是一种在编写可重用、灵活的代码时使用的工具。它允许我们在定义函数、类或接口时使用类型参数,以便在使用时指定具体的类型。

  • 通过使用泛型,我们可以编写更通用的代码,而不仅仅限于特定的类型。
    泛型提供了以下几个主要的用途和特性:
    1. 函数泛型:

    函数泛型允许我们编写可以接受不同类型参数并返回相同类型的函数。我们可以使用 <T> 或其他标识符作为泛型类型参数,并在函数参数和返回值中使用该参数。

    function identity<T>(arg: T): T {return arg;
    }
    

    在上述示例中,<T> 表示泛型类型参数。函数 identity 接受一个参数 arg,其类型为 T,并返回一个类型为 T 的值。通过这种方式,我们可以使用 identity 函数来处理不同类型的数据,而函数的输入和输出类型保持一致。

    2. 类泛型:

    类泛型允许我们创建可以处理多种类型数据的类。我们可以使用 <T> 或其他标识符作为泛型类型参数,并在类的属性、方法或构造函数中使用该参数。

    class Box<T> {value: T;constructor(value: T) {this.value = value;}
    }
    

    在上述示例中,<T> 表示泛型类型参数。类 Box<T> 中的属性 value 的类型是泛型类型 T。通过使用类泛型,我们可以创建一个能够存储不同类型值的盒子。

    3. 接口泛型:

    接口泛型允许我们定义具有多种类型成员的通用接口。我们可以使用 <T> 或其他标识符作为泛型类型参数,并在接口的属性、方法或其他成员中使用该参数。

    interface Pair<T, U> {first: T;second: U;
    }
    

    在上述示例中,<T, U> 表示泛型类型参数。接口 Pair<T, U> 定义了具有 firstsecond 属性的泛型类型。通过使用接口泛型,我们可以定义适用于多种类型组合的通用接口。

    4. 泛型约束:

    泛型约束允许我们对泛型类型进行更精细的限制。通过指定某些条件,我们可以限制泛型类型必须具有特定的属性或遵循特定的接口

    function loggingIdentity<T extends Lengthwise>(arg: T): T {console.log(arg.length);return arg;
    }
    

    在上述示例中,<T extends Lengthwise> 表示泛型类型参数 T 受到 Lengthwise 约束。这意味着传递给 loggingIdentity 函数的参数必须具有 Lengthwise 接口中的属性。通过使用泛型约束,我们可以更精确地定义泛型类型的行为。
    5. 泛型工具类型

    • Partial

      Partial<T> 是一个将泛型类型 T 中的所有属性设置为可选的工具类型。它将每个属性的类型都转换为可选属性,使我们可以对其进行部分更新。

      interface User {name: string;age: number;
      }
      
      type PartialUser = Partial<User>;
      // PartialUser 的类型为 { name?: string; age?: number; }
      

      在上述示例中,Partial<User>User 接口的属性全部转换为可选属性,生成了一个新的类型 PartialUser

    • Required

      Required<T> 是一个将泛型类型 T 中的所有属性设置为必需的工具类型。它将每个属性的类型都转换为必需属性,即不能为 undefined 或 null

      interface PartialUser {name?: string;age?: number;
      }type RequiredUser = Required<PartialUser>;
      // RequiredUser 的类型为 { name: string; age: number; }
      

      在上述示例中,Required<PartialUser> 将 PartialUser 类型的属性全部转换为必需属性,生成了一个新的类型 RequiredUser

    • Pick<T, K>:

      Pick<T, K> 是一个从泛型类型 T 中选取部分属性的工具类型。它接受一个类型参数 K,该参数表示要选择的属性的键。

      interface User {name: string;age: number;email: string;
      }type UserBasicInfo = Pick<User, 'name' | 'age'>;// UserBasicInfo 的类型为 { name: string; age: number; }
      

      在上述示例中,Pick<User, 'name' | 'age'>User 接口中选取了 nameage 属性,生成了一个新的类型 UserBasicInfo

    • Omit<T, K>:

      Omit<T, K> 是一个从泛型类型 T 中排除指定属性的工具类型。它接受一个类型参数 K,该参数表示要排除的属性的键。

      interface User {name: string;age: number;email: string;
      }type UserWithoutEmail = Omit<User, 'email'>;// UserWithoutEmail 的类型为 { name: string; age: number; }
      

      在上述示例中,Omit<User, 'email'>User 接口中排除了 email 属性,生成了一个新的类型 UserWithoutEmail

      除了上述示例中提到的工具类型,还有其他常用的泛型工具类型,如 Exclude<T, U>、Extract<T, U>、NonNullable<T>、ReturnType<T> 等。每个工具类型都有不同的用途和特性,可以根据具体的需求选择合适的工具类型来操作和转换泛型类型。

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

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

相关文章

tomcat的优化

TOMCAT的优化 tomcat的优化主要是从三个方面进行的&#xff0c;第一个是 tomcat配置的优化第二是对JVM虚拟机的优化第三是对Linux系统内核的优化&#xff0c;配置文件中的优化主要在tomcat中server.xml文件夹内 tomcat配置文件的优化 1、 maxThreads&#xff1a; Tomcat 使用…

调用微信公众号创建会员卡接口报错48001

调用文档&#xff1a;1.新版会员卡介绍 | 微信开放文档 接口地址&#xff1a; HTTP请求方式: POSTURL:https://api.weixin.qq.com/card/create?access_tokenACCESS_TOKEN 错误描述&#xff1a;48001 {"errcode":48001,"errmsg":"api unauthorized hi…

Fastjson反序列化漏洞

文章目录 一、概念二、Fastjson-历史漏洞三、漏洞原理四、Fastjson特征五、Fastjson1.2.47漏洞复现1.搭建环境2.漏洞验证&#xff08;利用 dnslog&#xff09;3.漏洞利用1)Fastjson反弹shell2)启动HTTP服务器3)启动LDAP服务4)启动shell反弹监听5)Burp发送反弹shell 一、概念 啥…

网站优化搜索引擎与关键词

网站优化搜索引擎与关键词 人们不应该高估搜索引擎的智商。这不利于seo的研究&#xff0c;事实上&#xff0c;搜索引擎是非常愚蠢的&#xff0c;让我们举一个非常简单的例子&#xff0c;你在搜索引擎中输入“教师”这个词&#xff0c;搜索引擎就会给出一个准确的搜索列表。我们…

U3D外包开发框架及特点

U3D&#xff08;Unity3D&#xff09;是一款流行的跨平台游戏开发引擎&#xff0c;用于创建2D和3D游戏以及交互性应用程序。U3D有许多常用的开发框架和库&#xff0c;这些框架和库可以扩展其功能&#xff0c;使开发人员更轻松地构建游戏和应用程序。以下是一些常用的U3D开发框架…

免费的敏捷项目管理,scrum开发软件

Scrum中非常强调公开、透明、直接有效的沟通&#xff0c;这也是“可视化的管理工具”在敏捷开发中如此重要的原因之一。通过“可视化的管理工具”让所有人直观的看到需求&#xff0c;故事&#xff0c;任务之间的流转状态&#xff0c;可以使团队成员更加快速适应敏捷开发流程。 …

3D打印,耗材注意事项

目前我的3D打印机只用到PETG和PLA俩种耗材材料 PLA 喷头温度:200或200热床温度40~50移动速度&#xff0c;最好100%挤出速度和移动速度最好一致 PETG PETG这个材料比PLA感觉上更软一点,商家说PLA比PETG温度更低 喷头温度:220~250℃热床温度最好80℃移动速度&#xff0c;最好5…

【计算机网络】 确认应答机制与超时重传

文章目录 ACK机制——确认应答机制超时重传 ACK机制——确认应答机制 当我们客户端发送了一个数据&#xff0c;seq是1100&#xff0c;那么服务端在收到时就会回一个ack101的ACK包&#xff0c;代表101之前的包我都收到了&#xff0c;下面请你从101继续发送。然后客户端就会发送1…

2.linux的组管理和权限管理

一、组管理 1.Linux组的介绍 在linux中每个用户必须属于一个组&#xff0c;不能独立于组外。在linux中每个文件有所有者&#xff0c;所有组&#xff0c;其他组的概念 ①所有者 ②所在组 ③其他组 ④改变用户所在组 2.文件/目录 所有者 哪个用户创建了文件&#xff0c;就…

【webrtc】时间戳reordered 重新排序、环绕的判断

inter_frame_delay_.CalculateDelay( ) 计算传输抖动值 webrtc源码分析(6)- jitter delay计算详解 大神对这块的使用,内涵外延,有深入细致的讲解。输入rtp时间戳、到达时间(当前系统时间?)-- 在rtp的时间戳的处理上,inter_frame_delay_.CalculateDelay( ) 计算传输抖动值…

《向量数据库指南》——向量数据库的底层原理是什么?

向量数据库的底层实现原理可以根据具体的数据库系统和索引方法而有所不同。不同的向量数据库可能使用不同的数据结构和算法来支持高效的向量存储和相似性搜索。以下是一些常见的底层实现原理和概念: 1、向量存储: 数据结构:向量数据库通常使用数据结构来存储向量数据。这些数…

Java测试(10)--- selenium

1.定位一组元素 &#xff08;1&#xff09;如何打开本地的HTML页面 拼成一个URL &#xff1a;file: /// 文件的绝对路径 import os os.path.abspath(文件的绝对路径&#xff09; &#xff08;2&#xff09;先定位出同一类元素&#xff08;tag name&#xff0c;name&…

DGA行为转变引发了对网络安全的担忧

Akamai的研究人员发现&#xff0c;在域名系统(DNS)流量数据中&#xff0c;动态种子域生成算法(DGA)家族的行为发生了令人担忧的变化。这一发现揭示了恶意行为者如何调整他们的策略来延长他们的指挥与控制(C2)通信通道的寿命&#xff0c;以保护他们的僵尸网络。 从技术角度来看…

计算机网络基础知识(非常详细)

1. 网络模型 1.1 OSI 七层参考模型 七层模型&#xff0c;亦称 OSI&#xff08;Open System Interconnection&#xff09;参考模型&#xff0c;即开放式系统互联&#xff0c;是网络通信的标准模型。一般称为 OSI 参考模型或七层模型。 它是一个七层的、抽象的模型体&#xff…

SpringMVC实现增删改查

文章目录 一、配置文件1.1 导入相关pom依赖1.2 jdbc.properties&#xff1a;配置文件1.3 generatorConfig.xml&#xff1a;代码生成器1.4 spring-mybatis.xml &#xff1a;spring与mybatis整合的配置文件1.5 spring-context.xml &#xff1a;上下文配置文件1.6 spring-mvc-xml:…

cookie、session与token之间的关系

Cookie、Session和Token机制在Web应用中主要用于验证用户的身份信息。通过这些机制&#xff0c;服务器能够确定请求是否来自已经登录的合法用户&#xff0c;并根据用户的身份进行相应的操作和授权。 具体来说&#xff1a; - Cookie和Session&#xff1a;Cookie和Session通常是…

2023高教社杯数学建模B题思路代码 - 多波束测线问题

# 1 赛题 B 题 多波束测线问题 单波束测深是利用声波在水中的传播特性来测量水体深度的技术。声波在均匀介质中作匀 速直线传播&#xff0c; 在不同界面上产生反射&#xff0c; 利用这一原理&#xff0c;从测量船换能器垂直向海底发射声波信 号&#xff0c;并记录从声波发射到…

什么是SpringMVC以及SpringMVC框架的优点

它是基于MVC开发模式的框架,用来优化控制器.它是Spring家族的一员.它也具备IOC和AOP. 什么是MVC? 它是一种开发模式,它是模型视图控制器的简称.所有的web应用都是基于MVC开发. M:模型层,包含实体类,业务逻辑层,数据访问层 模型 模型(Model)&#xff1a;就是业务流程/状态…

三网优惠话费充值接口源码文档 支持批量下单

话费充值接口文档 接口版本&#xff1a;1.0 ―、引言 文档概述 本文档提供话费充值接口规范说明&#xff0c;提供一整套的完整的接入示例(http 接口)供商户参 考&#xff0c;可以帮助商户开发人员快速完成接口开发与联调&#xff0c;实现与话费充值系统的交易互联。 公司官网…

Pytest模式执行python脚本不生成allure测试报告

1.安装allure 下载allure的zip安装包 将allure.zip解压到python的lib目录中 将allure的bin路径添加到环境变量path中(注意&#xff1a;配置环境变量后&#xff0c;一定要重启电脑。因为环境变量没生效&#xff0c;我搞了半天在pycharm不能生成报告&#xff0c;在cmd中可以生成…