当前位置: 首页 > news >正文

【TypeScript学习之路】泛型

【TypeScript学习之路】泛型

文章目录

  • 【TypeScript学习之路】泛型
  • 写在前面
  • 前言
  • 一、认识泛型
    • 1.1 什么是泛型
    • 1.2 泛型函数的使用
  • 二、泛型接口与泛型类
    • 2.1 泛型接口
    • 2.2 泛型类
  • 三、泛型约束

写在前面

🤗这里是前端程序员小张!

🌻人海茫茫,感谢这一秒你看到这里。希望我的文章对你的有所帮助!

🌟愿你在未来的日子,保持热爱,奔赴山海!

前言

软件工程中,我们不仅要创建一致的定义良好的API,同时也要考虑可重用性。 组件不仅能够支持当前的数据类型,同时也能支持未来的数据类型,这在创建大型系统时为你提供了十分灵活的功能。

在像C#和Java这样的语言中,可以使用泛型来创建可重用的组件,一个组件可以支持多种类型的数据。 这样用户就可以以自己的数据类型来使用组件。

一、认识泛型

1.1 什么是泛型

软件工程的主要目的是构建不仅仅明确和一致的API,还要让你的代码具有很强的可重用性:

  • 比如我们可以通过函数来封装一些API,通过传入不同的函数参数,让函数帮助我们完成不同的操作
  • 但是对于参数的类型是否也可以参数化呢?

什么是类型的参数化

我们来提一个需求:封装一个函数,传入一个参数,并且返回这个参数;

//TypeScript的思维方式,要考虑这个参数和返回值的类型需要一致
function fn(arg: number): number {return arg;
}

上面的代码虽然实现了,但是不适用于其他类型,比如string、boolean、自定义类等类型;

function fn(arg: any): any {return arg;
}

使用any类型会导致这个函数可以接收任何类型的arg参数,这样就丢失了类型信息

  • 传入的类型与返回的类型应该是相同的。
  • 如果我们传入一个数字,我们只知道任何类型的值都有可能被返回。

因此,我们需要一种方法使返回值的类型与传入参数的类型是相同的。 这里,我们使用了 类型变量,它是一种特殊的变量,只用于表示类型而不是值

function fn<Type>(arg: Type): Type {return arg;
}
  • 我们给 fn 添加了类型变量Type
  • Type帮助我们捕获用户传入的类型(比如:number),之后我们就可以使用这个类型。 之后我们再次使用了 Type当做返回值类型。
  • 现在我们可以知道参数类型与返回值类型是相同的了。 这允许我们跟踪函数里使用的类型的信息。

我们把这个版本的fn函数叫做泛型,因为它可以适用于多个类型。

不同于使用 any它不会丢失信息,像第一个例子那像保持准确性,传入数值类型并返回数值类型

1.2 泛型函数的使用

我们定义了泛型函数后,可以用两种方法使用。

  • 通过 <类型> 的方式将类型传递给函数;
fn<string>("hello world")
fn<number>(123)
  • 通过类型推导(type argument inference),自动推到出我们传入变量的类型
    • 在这里会推导出它们是 字面量类型的,因为字面量类型对于我们的函数也是适用的
let message1 = fn("hello world")
let message2 = fn(123)

在这里插入图片描述

在这里插入图片描述

当然我们也可以传入多个类型:

function fn<T, E>(a1: T, a2: E) {}

平时在开发中我们可能会看到一些常用的名称:

  • T:Type的缩写,类型
  • K、V:key和value的缩写,键值对
  • E:Element的缩写,元素
  • O:Object的缩写,对

二、泛型接口与泛型类

2.1 泛型接口

在定义接口的时候我们也可以使用泛型:

  • 我们可能想把泛型参数当作整个接口的一个参数;
  • 这样我们就能清楚的知道使用的具体是哪个泛型类型;
  • 这样接口里的其它成员也能知道这个参数的类型了
interface IFn<T> {(arg: T): T;
}function fn<T>(arg: T): T {return arg;
}let myFn: IFn<number> = fn;
  • 当我们使用 IFn的时候,还得传入一个类型参数来指定泛型类型(这里是:number),锁定了之后代码里使用的类型。

2.2 泛型类

泛型类看上去与泛型接口差不多。 泛型类使用( <>)括起泛型类型,跟在类名后面。

class Point<T> {x: T;y: T;constructor(x: T, y: T) {this.x = x;this.y = y;}
}const p1 = new Point(10, 20);
const p2 = new Point<number>(20, 30);
const p3: Point<number> = new Point(40, 60);

三、泛型约束

我们有时候想操作某类型的一组值,并且我们知道这组值具有什么样的属性

  • 我们希望传入的类型有某些共性,但是这些共性可能不是在同一种类型中

    • 在上述例子中,我们想访问arglength属性,但是编译器并不能证明每种类型都有length属性,所以就报错了

    • 比如string和array都是有length的,或者某些对象也是会有length属性的;

  • 那么只要是拥有length的属性都可以作为我们的参数类型,那么应该如何操作呢?为此,我们需要列出对于T的约束要求。

我们定义一个接口来描述约束条件。 创建一个包含 .length属性的接口,使用这个接口和extends关键字来实现约束:

interface TLength {length: number;
}function getLength<T extends TLength>(args: T) {return args.length;
}

现在这个泛型函数被定义了约束,因此它不再是适用于任意类型:

getLength(3) // Argument of type 'number' is not assignable to parameter of type 'ILength'.

我们需要传入符合约束类型的值

console.log(getLength("hello"))
console.log(getLength(["abe", "de"]))
console.log(getLength({length: 10, name: "zhang"}))

在这里插入图片描述

相关文章:

【TypeScript学习之路】泛型

【TypeScript学习之路】泛型 文章目录【TypeScript学习之路】泛型写在前面前言一、认识泛型1.1 什么是泛型1.2 泛型函数的使用二、泛型接口与泛型类2.1 泛型接口2.2 泛型类三、泛型约束写在前面 &#x1f917;这里是前端程序员小张&#xff01; &#x1f33b;人海茫茫&#xff…...

数据分析学习项目:东京奥运会跳水评论分析

“中国跳水梦之队” ————有关东京奥运会跳水评论分析 导语 第32届夏季奥林匹克运动会于2021年07月23日-2021年08月08日在日本东京举办。 四年一届的奥运会可以说是世界瞩目的盛会&#xff0c;奥运健儿们在赛场上的精神风貌不只是代表了他们自身的运动精神&#xff0c;更昭…...

Winform/Csharp中使用Linq的Where条件筛选、Select字段映射(左外连接并设置无匹配时默认值)、OrderBy(排序并自定义排序规则)

场景 Java8新特性-Stream对集合进行操作的常用API&#xff1a; Java8新特性-Stream对集合进行操作的常用API_streamapi操作集合_霸道流氓气质的博客-CSDN博客 上面讲的是在Java中使用Stream中对集合的常用操作。 在C#中Linq是有对应的类似的api。 完整和详细的用法可自行查…...

Linux-常用的Shell命令

文章目录前言常用的Shell命令文件和目录管理查看文件、目录信息查看文件内容查看文件类型查找文件查找内容查看目录大小创建文件删除文件拷贝文件移动文件创建目录删除目录拷贝目录压缩文件解压文件路径相关操作目录切换显示当前路径用户、用户组管理创建用户删除用户创建用户组…...

Go语言基础:数组定义及循环遍历

前言 大家好&#xff0c;我是沐风晓月&#xff0c;本文go语言入门-掌握go语言函数收录于《go语言学习专栏》专栏&#xff0c;此专栏带你从零开始学习go语言&#xff0c;持续更新中&#xff0c;欢迎点赞收藏。 &#x1f3e0;个人主页&#xff1a;我是沐风晓月 &#x1f9d1;个人…...

【树与二叉树】二叉树顺序结构实现以及堆的概念及结构--详解介绍

​ ​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;数据结构 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 文章目录1. 二叉树顺序结构2.…...

天狗实战(二)SpringBoot API开发详解 --SpringMVC注解+封装结果+支持跨域+打包(下)

本文目录 前言专栏介绍一、创建SpringBoot项目1.1 添加springboot依赖1.2 创建启动类1.3 创建控制器类1.4 Run 或 Debug二、开发图书管理API2.1 web层BookAdminControllerBookVO2.2 service层BookServiceBookServiceImplBookBO2.3 dal层...

实验一 Windows系统安全实验【网络安全】

实验一 Windows系统安全实验【网络安全】前言推荐实验一 Windows系统安全实验3.1 帐户和口令的安全设置3.1.1 实验目的3.1.2 实验环境3.1.3 实验内容和步骤1. 删除不再使用的帐户并禁用guest帐户2.启用密码策略和帐户锁定策略3.查看“用户权限分配”4.查看“用户组权限分配”5.…...

蓝桥杯正确的解题姿势

在做算法题的过程中最忌讳的就是上来就一顿乱敲&#xff0c;一开始我就是这样&#xff0c;但随着不断的刷题和老师的指导&#xff0c;总结了自己的刷题方法 示例题目 三角回文数 问题描述 对于正整数 n, 如果存在正整数 k使得 n123...kk(k1)/2 , 则 n 称为三角数。例如, 66066 …...

【mysql】性能优化

目录一、硬件与操作系统二、架构设计层面的优化三、mysql程序配置优化四、mysql执行优化一、硬件与操作系统 1.使用高性能cpu&#xff0c;提高计算能力 2.增大可用内存&#xff0c;提高读取能力 3.提高硬盘的读写速度&#xff0c;使用专用的固态硬盘 4.增大网络带宽&#xff0c…...

Jupyter安装与远程使用过程记录

Jupyter安装与远程使用过程记录 文章目录Jupyter安装与远程使用过程记录Jupyter在线试用在服务器上安装Jupyter Notebook配置服务器远程连接首先保证ip地址连通性其次开启服务器访问端口然后在服务器启动服务最后测试连通性后续使用教程Jupyter在线试用 官网适用&#xff0c;感…...

Swift入门

基本数据类型 Int、UInt&#xff1a;整数型、非负整数Float、Double&#xff1a;单精度浮点数、双精度浮点数Bool&#xff1a;布偶值String、Character&#xff1a;字符串、字符 其他类型 Array, Dictionary&#xff1a;数组、字典StructClassvar&#xff1a;变量let&#x…...

【HashMap】jdk1.8中HashMap的插入扩容源码学习分析

jdk1.8中HashMap的插入扩容源码学习分析 一、成员变量 首先介绍HashMap中各个成员变量的作用&#xff0c;在HashMap中有以下成员变量 size记录了HashMap中键值对的个数 loadFactor&#xff08;加载因子&#xff09;用来决定size达到容量的百分之多少时触发扩容机制 默认是0…...

Linux编译器-gcc/g++ 使用

在介绍gcc/g的使用前我们先了解一下两者的不同 gcc时主要编译c语言&#xff0c;而g主要编译c的&#xff0c;但是两者的选项是相同的&#xff0c;因此我们以gcc和c语言为例来讲解。背景知识 gcc和g都是编译器其核心作用将文本类文件翻译成二进制可执行 那么其过程是怎样的&…...

网络安全专家最爱用的9大工具

网络安全专家&#xff0c;不是你认为的那种搞破坏的 “黑客”。网络安全专家&#xff0c;即 “ethical hackers”&#xff0c;是一群专门模拟网络安全专家攻击&#xff0c;帮助客户了解自己网络的弱点&#xff0c;并为客户提出改进建议的网络安全专家。 网络安全专家在工作中&a…...

Linux内核设计与实现第四章学习笔记

文章目录Linux内核设计与实现第四章学习笔记具体场景Linux调度算法传统的调度公平调度调度的实现时间记账调度器实体虚拟实时进程选择调度器入口睡眠和唤醒抢占和上下文切换用户抢占内核抢占实时调度策略Linux内核设计与实现第四章学习笔记 进程优先级&#xff1a;Linux中采用…...

i.MX9352——介绍一款多核异构开发板

本篇来介绍一款多核异构的Linux开发板——OK-MX9352-C开发板。 1 开发板硬件介绍 OK-MX9352-C开发板由核心板和底板组成&#xff0c;核心板采用处理器芯片为NXP的i.MX9352&#xff0c;这是一款多核异构的芯片&#xff0c;核心板基础配置如下 CPU&#xff1a;2Cortex-A551.5G…...

【Python】一文学会面向对象?当然可以的

文章目录前言一、万物皆对象二、类也是对象三&#xff0c;元类总结前言 在大家学习python的时候&#xff0c;一定听说过一句话&#xff1a; 在我们python中万物皆对象&#xff0c;不管是整数、字符串、列表、字典这些基本数据类型&#xff0c;还是函数、以及自定义类创建出来…...

ElasticSearch - SpringBoot整合ES:精确值查询 term

文章目录00. 数据准备01. ElasticSearch 结构化搜索是什么&#xff1f;02. ElasticSearch 结构化搜索方式有哪些&#xff1f;03. ElasticSearch 全文搜索方式有哪些&#xff1f;04. ElasticSearch term 查询数字&#xff1f;05. ElasticSearch term 查询会不会计算评分&#xf…...

【GPT4】微软对 GPT-4 的全面测试报告(2)

欢迎关注【youcans的GPT学习笔记】原创作品&#xff0c;火热更新中 微软对 GPT-4 的全面测试报告&#xff08;1&#xff09; 微软对 GPT-4 的全面测试报告&#xff08;2&#xff09; 【GPT4】微软对 GPT-4 的全面测试报告&#xff08;2&#xff09;2. 多模态与跨学科的组合&…...

Chapter03-Authentication vulnerabilities

文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

Cursor实现用excel数据填充word模版的方法

cursor主页&#xff1a;https://www.cursor.com/ 任务目标&#xff1a;把excel格式的数据里的单元格&#xff0c;按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例&#xff0c;…...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增&#xff1a;通道注意力模块&#xff08;SE模块&#xff09; class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

为什么要创建 Vue 实例

核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...

给网站添加live2d看板娘

给网站添加live2d看板娘 参考文献&#xff1a; stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下&#xff0c;文章也主…...

用鸿蒙HarmonyOS5实现中国象棋小游戏的过程

下面是一个基于鸿蒙OS (HarmonyOS) 的中国象棋小游戏的实现代码。这个实现使用Java语言和鸿蒙的Ability框架。 1. 项目结构 /src/main/java/com/example/chinesechess/├── MainAbilitySlice.java // 主界面逻辑├── ChessView.java // 游戏视图和逻辑├──…...

Linux安全加固:从攻防视角构建系统免疫

Linux安全加固:从攻防视角构建系统免疫 构建坚不可摧的数字堡垒 引言:攻防对抗的新纪元 在日益复杂的网络威胁环境中,Linux系统安全已从被动防御转向主动免疫。2023年全球网络安全报告显示,高级持续性威胁(APT)攻击同比增长65%,平均入侵停留时间缩短至48小时。本章将从…...

WEB3全栈开发——面试专业技能点P4数据库

一、mysql2 原生驱动及其连接机制 概念介绍 mysql2 是 Node.js 环境中广泛使用的 MySQL 客户端库&#xff0c;基于 mysql 库改进而来&#xff0c;具有更好的性能、Promise 支持、流式查询、二进制数据处理能力等。 主要特点&#xff1a; 支持 Promise / async-await&#xf…...

用 Rust 重写 Linux 内核模块实战:迈向安全内核的新篇章

用 Rust 重写 Linux 内核模块实战&#xff1a;迈向安全内核的新篇章 ​​摘要&#xff1a;​​ 操作系统内核的安全性、稳定性至关重要。传统 Linux 内核模块开发长期依赖于 C 语言&#xff0c;受限于 C 语言本身的内存安全和并发安全问题&#xff0c;开发复杂模块极易引入难以…...

标注工具核心架构分析——主窗口的图像显示

&#x1f3d7;️ 标注工具核心架构分析 &#x1f4cb; 系统概述 主要有两个核心类&#xff0c;采用经典的 Scene-View 架构模式&#xff1a; &#x1f3af; 核心类结构 1. AnnotationScene (QGraphicsScene子类) 主要负责标注场景的管理和交互 &#x1f527; 关键函数&…...