TypeScript基础篇 - 泛型
目录
泛型的概念
接口是对方面的描述(Aspect),继承其中几个方法。重定义方法
泛型是对共性的提取
泛型(Generics)
泛型的例子
泛型类
推荐写法
泛型约束
keyof操作符
泛型的特化(实例化)
小结
泛型的概念
- 对比这3个概念,思考他们的区别:
- interface(接口)
- Car is runnable
- Extend(继承)
- Car is machine
- Generics(泛型)
- Runnable
- interface(接口)
// 接口写法
interface Runnable { // 接口run() : number
}
interface Repairable {repaire(): void
}
class Car implements Runnable, Repairable {run() : number {return 1 }repaire(){return }
}
// 继承写法;不是首选,因为它的祖类可能功能太多了,不一定适应子类
class XXXCar extends Car {run() : number {return 1 }repaire(){return }
}
接口是对方面的描述(Aspect),继承其中几个方法。重定义方法
- 小孩可以长大
- 小孩是Growable
- 动物可以进化
- 人是Evolvable
泛型是对共性的提取
- 木头可以做桌子
- 木头是:DeskMakable?
- 木头还可以:burn/wash/play...(耦合)
- 泛型的表达
- DeskMaker<Wood>
- DeslMaler<Iron>
interface Material {getHardness(): number;
}
class DeskMake <T extends Material> { // 做桌子的泛型material : T // 材料make() {const hardness = this.material.getHardness() }
}
// 泛型的解耦
const maker = new DeskMaker<Wood>()// 做木头桌子
const maker = new DeskMaker<Iron>()// 做铁桌子
泛型(Generics)
- 对共性的抽象
- 将类型作为参数
- 更好的分离关注点
泛型的例子
// 一个identity函数是自己返回自己的函数
// 当然可以声明它是:number =>number
function identity(arg:number): number {return arg;
}
// 为了让identity支持更多类型可以声明它是any
function identity(arg:any):any {return arg;
}
// any会丢失后续的所有检查,因此可以考虑用泛型
function identity<Type>(arg:Type): Type {return arg;
}
let output = identity<string>("MyString")
// 不用显示的指定<>中的类型
// let output = identity("MyString")
output = 100 // Error
泛型类
class GenericNumber<NumType> {zeroValue: NumType;add: (x: NumType, y : NumType) => NumType;
}
let myGenericNumber = new GenericNumber<number>();
myGenericNumber.zeroValue = 0;
// (number, number) -> number
myGenericNumber.add = function (x,y) {return x + y;
}
let stringNumeric = new GenericNumber<string>();
stringNumeric.zeroValue = "";
stringNumeric.add = function (x,y){return x + y;
}
推荐写法
class GenericNumber<T> {zeroValue: Tconstructor(v:T) { // 构造器this.zeroValue = v }add(x:T,y:T) {return x + y }
}
泛型约束
type lengthwise = {length: number
}
interface lengthwise {length: number
}
function loggingIdentity<Type extends {length: number
}>(arg: Type): Type {console.log(arg.length);return arg
}
keyof操作符
type Point = { x:number; y: number };
type P = keyof Point;
// P = "x" | "y"
function foo(x: keyof Point) {}
泛型的特化(实例化)
function create<Type>(c: { new(): Type }): Type {return new c();
}
create(Array) // Array的实例 => new Array()
create(Array<string>)// Error,不能完全替代实例化函数
小结
- 泛型解决了什么问题?解决了在我们做程序设计的时候,对于很多共性的抽象的问题,同时也解决了很多共性问题类型设计不够严格的问题。
- 什么时候用接口?什么时候用泛型?当你想约束一个类型,它有哪些成分的时候用接口,当你想提取一类东西共性的时候我们用泛型
- 下面方法是否成立?不成立
function add<T>(a:T,b:T){return a + b
}
相关文章:
TypeScript基础篇 - 泛型
目录 泛型的概念 接口是对方面的描述(Aspect),继承其中几个方法。重定义方法 泛型是对共性的提取 泛型(Generics) 泛型的例子 泛型类 推荐写法 泛型约束 keyof操作符 泛型的特化(实例化ÿ…...
C++ 常量
常量是固定值,在程序执行期间不会改变。这些固定的值,又叫做字面量。 常量可以是任何的基本数据类型,可分为整型数字、浮点数字、字符、字符串和布尔值。 常量就像是常规的变量,只不过常量的值在定义后不能进行修改。 整数常量…...
智安网络|实现数据安全:探索数据动态脱敏的落地策略
在当今数字化时代,数据安全成为企业和组织管理中的头等大事。然而,数据共享和数据大规模处理的需求也日益增长,这就需要在数据传输和存储过程中采取措施来保护用户的隐私。数据动态脱敏技术应运而生,为解决数据隐私和保护的问题提…...
全加器(多位)的实现
一,半加器 定义 半加器(Half Adder)是一种用于执行二进制数相加的简单逻辑电路。它可以将两个输入位的和(Sum)和进位(Carry)计算出来。 半加器有两个输入:A 和 B,分别代表…...
Clion开发stm32之微妙延迟(采用nop指令实现)
前言 需要借助逻辑分析仪动态调整参数此次测试的开发芯片为stm32f103vet6 延迟函数 声明 #define NOP_US_DELAY_MUL_CNT 5 /*nop 微妙延迟需要扩大的倍数(根据实际动态修改)*/ void bsp_us_delay_nop(uint32_t us);void bsp_ms_delay_nop(uint32_t ms);定义 void bsp_us_dela…...
Spring MVC -- 获取参数(普通对象+JSON对象+URL地址参数+文件+Cookie/Session/Header)
目录 1.获取参数 1.1获取单个参数 1.2获取多个参数 传参注意事项: 2.获取对象 3.后端参数重命名RequestParam 4.获取JSON对象RequestBody 5.从 URL 地址中获取参数 PathVariable 6.上传文件 RequestPart 7.获取Cookie/Session/Header 7.1 获取 Request 和…...
Langchain 的 Conversation summary memory
Langchain 的 Conversation summary memory 现在让我们看一下使用稍微复杂的内存类型 - ConversationSummaryMemory 。这种类型的记忆会随着时间的推移创建对话的摘要。这对于随着时间的推移压缩对话中的信息非常有用。对话摘要内存对发生的对话进行总结,并将当前摘…...
Safari 查看 http 请求
文章目录 1、开启 Safari 开发菜单2、显示 JavaScript 控制台 1、开启 Safari 开发菜单 Safari 设置中,打开开发菜单选项 *** 选择完成后,Safari 的目录栏就会出现一个 开发 功能。 2、显示 JavaScript 控制台 开启页面后,在开发中选中 显…...
kafka权限控制功能
参考链接: https://www.clougence.com/cc-doc/dataMigrationAndSync/database/privs_for_kafka Kafka需要的权限 | CloudCanal of ClouGence Kafka Topic 权限控制可以通过使用 Apache Kafka 的内置安全特性来实现。这主要涉及到两个方面:认证&#…...
公司内部重要文件如何加密防止泄露?
现如今,是互联网时代,数据安全在互联网时代中的数据安全岌岌可危,企业中,都会拥有终端,终端中每天都要处理文档,文件,表格,产生一系列的数据问题等,这个时候就要先企业中…...
C语言或Java-x型图案
描述 KiKi学习了循环,BoBo老师给他出了一系列打印图案的练习,该任务是打印用“*”组成的X形图案。 输入描述 多组输入,一个整数(2~20),表示输出的行数,也表示组成“X”的反斜线和正斜线的长度。…...
FTP客户端登录报错:Login failed
FTP客户端登录报错:Login failed 是selinux的问题,一般用户无法登录用户主目录 [rootchenshuyi ~]# setsebool -P tftp_home_dir 1...
Linux相关指令(上)
常见指令: 1 pwd:查看用户当前所在目录 以下面的路径为例: 2 ls:对于目录,该命令列出该目录下的所有子目录与文件。 对于文件,将列出文件名以及其他信息 ls-l(or ll):列…...
电压放大器在管道缺陷检测中应用有哪些
管道是一种重要的输送工业介质的设施,广泛应用于石油、化工、水利等领域。然而,由于长期使用和外界环境因素等原因,管道内部常会出现各种缺陷和损伤,如腐蚀、裂纹、磨损等,这些问题如果得不到及时发现和修复࿰…...
NLP(六十二)HuggingFace中的Datasets使用
Datasets库是HuggingFace生态系统中一个重要的数据集库,可用于轻松地访问和共享数据集,这些数据集是关于音频、计算机视觉、以及自然语言处理等领域。Datasets 库可以通过一行来加载一个数据集,并且可以使用 Hugging Face 强大的数据处理方法…...
Windows下基于VSCode搭建C++开发环境(包含整合MinGW64、CMake的详细流程)
最近想写写C,装了VisualStudio 2022,折腾半天。对于一个用惯VSCode的人来说,总感觉IDE太笨重。于是自己网上各种查资料,自己琢磨,搭建了一套Windows下基于VSCode和CMake的C轻量级开发环境。 具体搭建步骤 1. 下载并安…...
springboot+mybatis-plus+vue+element+vant2实现短视频网站,模拟西瓜视频移动端
目录 一、前言 二、管理后台 1.登录 2.登录成功,进入欢迎页 编辑 3.视频分类管理 4. 视频标签管理 5.视频管理 6.评论管理 编辑 7.用户管理 8.字典管理 (类似于后端的枚举) 9.参数管理(富文本录入) 10.管…...
MySQL学习-第二部分
文章目录 MySQL数据库学习1 表1.1 表中的数据类型1.2 表的创建1.3 表的删除1.4 default设置字段默认值1.5 表结构的修改1.5.1 表名的修改1.5.2 字段名的修改1.5.3 修改字段类型1.5.4 添加字段1.5.5 删除字段1.5.6 表的复制 1.6 表的约束1.6.1 什么是约束?1.6.2 not …...
TortoiseGit 入门指南17:使用子模块
如果你想在自己的代码仓库中嵌入其它仓库,这称为引入子模块(Submodule)。使用右键菜单TortoiseGit - Submodules Add 选项,弹出添加子模块对话框,可以将一个外部仓库嵌入到源代码树的专用子目录中。 Repository&#x…...
谷粒商城篇章5 ---- P173-P192 ---- 检索服务【分布式高级篇二】
目录 1 检索服务 1.1 搭建页面环境 1.1.1 引入依赖 1.1.2 将检索页面放到gulimall-search的src/main/resources/templates/目录下 1.1.3 调整搜索页面 1.1.4 将静态资源放到linux的nginx相关映射目录下/root/docker/nginx/html/static/ search/ 1.1.5 SwitchHosts配置域…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...
【大模型RAG】Docker 一键部署 Milvus 完整攻略
本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...
【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...
PL0语法,分析器实现!
简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...
成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战
在现代战争中,电磁频谱已成为继陆、海、空、天之后的 “第五维战场”,雷达作为电磁频谱领域的关键装备,其干扰与抗干扰能力的较量,直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器,凭借数字射…...
