TypeScript——泛型

news2024/11/20 4:52:35

泛型(Generics)是指在定义函数、接口或类的时候,不预先指定具体的类型,而在使用的时候再指定类型的一种特性。

函数泛型

本来函数参数类型的不同时,要写多个,现在用泛型,只需要使用时传参即可

  • 单个类型参数
function str(a: string, b: string): Array<string> {
  return [a, b]
}

function num(a: number, b: number): Array<number> {
  return [a, b]
}

str('1', '2')
num(1, 2)

function fn<T>(a: T, b: T): Array<T> {
  return [a, b]
}

fn(1,2)
fn('1','2')
  • 多个类型参数
function fn<T, U>(a: T, b: U): Array<T | U> {
  return [a, b]
}

fn(1, true)
fn('1', '2')

类型别名泛型

type A<T> = string | number | T

let a: A<boolean> = true
let a1: A<undefined> = undefined

泛型接口

interface Person<T, U> {
  name: T
  age: U
}

let p: Person<string, number> = {
  name: 'zs',
  age: 18,
}

泛型约束

在函数内部使用泛型变量的时候,由于事先不知道它是哪种类型,所以不能随意的操作它的属性或方法

function fn<T>(a: T) {
  console.log(a.length) 
  // error TS2339: Property 'length' does not exist on type 'T'
}

fn('111')
fn([1, 2, 3])

这时,我们可以对泛型进行约束,只允许这个函数传入那些包含 length 属性的变量。这就是泛型约束

interface Len {
  length: number
}

function fn<T extends Len>(a: T) {
  console.log(a.length)
}

fn('111')
fn([1, 2, 3])

使用keyof约束对象

其中使用了TS泛型和泛型约束。首先定义了T类型并使用extends关键字继承object类型的子类型,然后使用keyof操作符获取T类型的所有键,它的返回类型是联合类型,最后利用extends关键字约束 K类型必须为keyof T联合类型的子类型

let person = {
  name: 'zs',
  age: 18,
}

function fn<T, K>(obj: T, key: K) {
  console.log(obj[key])
  // error TS2536: Type 'K' cannot be used to index type 'T'
}
let person = {
  name: 'zs',
  age: 18,
}

function fn<T extends object, K extends keyof T>(obj: T, key: K) {
  console.log(obj[key])
}

fn(person, 'name') // zs
fn(person, 'age') // 18

高阶用法

interface Data {
  name: string
  age: number
  sex: string
}

type Options<T extends object> = {
  [key in keyof T]?: T[key]
}

type B = Options<Data>

在这里插入图片描述

泛型类

声明方法跟函数类似名称后面定义<类型>

class Sub<T> {
  attr: T[] = []
  add(a: T): T[] {
    return [a]
  }
}

let s = new Sub<number>()
s.attr = [1, 2, 3]
console.log(s.add(123)) // [123]

let str = new Sub<string>()
str.attr = ['1', '2', '3']
console.log(str.add('123')) // ['123']

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

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

相关文章

android studio 一直卡在Build android:Download maven-metadata.xml

在android studio进行此操作&#xff0c;关闭gradle的联网功能

使用MM32L0130和HYS1254的电子秤方案验证

使用MM32L0130和HYS1254的电子秤方案验证 文章目录 使用MM32L0130和HYS1254的电子秤方案验证引言电路设计软件设计采集HYS1254数据软件滤波算法换算压力为ADC采样值 实验过程数据可视化优化电路使用软件滤波降低ADC的采样速率使用独立的供电电源再次调整滤波算法 验证总结参考文…

M1 macbook上安装docker 编译内核 并使用qemu启动内核。

1、在M1上安装docker这个就不用提供步骤了&#xff0c;网上自行搜索。 2、在M1上pull一个ubuntu的容器。docker pull ubuntu:18.04 docker images REPOSITORY TAG IMAGE ID CREATED SIZE ubuntu 18.04 d1a528908992 …

python实现Edge的爬虫

python实现Edge的爬虫 查看Edge的版本号 下载对应的驱动 官网驱动链接: link 根据自己的系统选择相应的驱动 解压后放在自己的python的Scripts路径&#xff0c;并改名为 MicrosoftWebDriver 安装python库 常用的爬虫库&#xff1a; from bs4 import BeautifulSoup import …

回归预测 | MATLAB实现基于QPSO-GRU、PSO-GRU、GRU多变量回归预测

回归预测 | MATLAB实现基于QPSO-GRU、PSO-GRU、GRU多变量回归预测 目录 回归预测 | MATLAB实现基于QPSO-GRU、PSO-GRU、GRU多变量回归预测效果一览基本描述程序设计参考资料 效果一览 基本描述 1.Matlab实现QPSO-GRU、PSO-GRU和GRU门控循环单元多变量回归预测&#xff1b; 2.输…

Word中页码变成 {PAGE \* MERGEFORMAT}

今天在写材料的时候Word突然就完蛋了&#xff0c;页码什么的出现乱码了&#xff0c;然后就搜索了一下&#xff0c;找到了解决办法&#xff0c;这里记录一下&#xff0c;方便以后查阅。 Word中页码变成 {PAGE \* MERGEFORMAT}

AndroidTV开发14优雅地实现TV端超长巨图加载

AndroidTV开发14优雅地实现TV端超长巨图加载 1.前言 之前在Android和Vue端都实现过长图加载&#xff0c;虽然实现需求&#xff0c;但是有很多问题没有解决&#xff0c;效果也不尽人意今天就各种问题来分析一下&#xff1a; 图片加载时清晰度不是很好&#xff0c;会失真的情况…

vscode编辑器如何显示.git隐藏文件, vscode不显示git文件怎么办

问题描述 我想要设置pre-commit hook ,但是我在vscode项目里创建的时候&#xff0c;发现此文件已存在&#xff0c;想看隐藏文件夹 .git&#xff0c;但是我看不到它,想看隐藏文件夹 .git&#xff0c;此时该怎么办呢&#xff1f; 1. 文件-首选项-设置 2. 搜索 files , 然后去掉…

Canny边缘检测

Canny边缘检测 步骤&#xff1a; 使用高斯滤波器&#xff0c;以平滑图像&#xff0c;滤波噪声计算图像中每个像素点的梯度强度和方向应用非极大值抑制&#xff08;Non-Maximum Suppression&#xff09;&#xff0c;以消除边缘检测带来的杂散响应应用双阈值&#xff08;Double…

Zadig v1.16.0升级到v1.17.0

文章目录 数据备份MongoDB备份MySQL备份 升级 参考官网链接&#xff1a; https://docs.koderover.com/zadig/Zadig%20v1.17.0/release-notes/v1.17.0/#%E5%8A%9F%E8%83%BD%E5%88%97%E8%A1%A8 数据备份 MongoDB备份 rootzz808:~# kubectl get svc -n zadig |grep mongo kr-mon…

STM32单片机(六)TIM定时器 -> 第四节:TIM输出比较练习3(PWM驱动直流电机)

❤️ 专栏简介&#xff1a;本专栏记录了从零学习单片机的过程&#xff0c;其中包括51单片机和STM32单片机两部分&#xff1b;建议先学习51单片机&#xff0c;其是STM32等高级单片机的基础&#xff1b;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 &#xff1a;适用于想要…

防近视台灯有效果吗?专家公认的防近视台灯

答案是有的。主要是因为这种护眼台灯的光线都比较柔和&#xff0c;它主要是由发光源和灯具两部分组成。发光源呢主要是以LED灯作为光源&#xff0c;光线比较稳定均匀一点。而灯具的设计可以改善光线的分布&#xff0c;柔化光线&#xff0c;提高均匀度和光照面积等等&#xff0c…

重金属冶炼VR仿真实训教学提高了实验效率

有色金属冶炼VR虚拟实操软件是一种新型的教育工具&#xff0c;它通过VR虚拟现实技术&#xff0c;将学生带入到真实的有色金属冶炼过程中&#xff0c;让学生在模拟环境中进行实践操作&#xff0c;从而提高学生的实践能力和理论知识水平。相比传统的教学方式&#xff0c;有色金属…

vue属性中的数据绑定v-text与响应式操作v-html+vue中鼠标悬停显示效果+布尔值在vue中引用属性中的操作

1&#xff0c;vue属性中的数据绑定v-text与响应式操作v-html 当我们导入vue框架后&#xff0c;对于数据的绑定功能&#xff0c;我们使用v-text的语法功能&#xff1a; <div v-text "message"><div>在该情况下&#xff0c;我们可以输出对应属性的文本&a…

idea服务强制关闭导致mysql某条数据被锁

今天开发测试时候&#xff0c;idea debug模式下报错&#xff0c;数据库表事务没有提交&#xff0c;idea服务强制关闭&#xff0c;导致数据库表某一条记录被锁 1、查进程&#xff0c;查找被锁表的那个进程的ID show processlist;command 为waitting的就是锁住的表&#xff0c;…

LeetCode做题笔记第11题:盛最多水的容器

题目描述 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 来源&#xff1a;力扣&#xf…

uni-app 微信小程序端调用扫一扫识别小程序码(菊花码,太阳码)

返回值中&#xff0c;path就是小程序码对应的路径 扫描的码必须本小程序AppID和secret生成的&#xff0c;也可以在小程序后台-->工具-->填写小程序路径 生成进行测试 uni.scanCode({success(res) {console.log(res)} })

error: RPC failed; curl 28 OpenSSL SSL_read: Connection was reset, errno 10054

clone MiniGPT-4的时候报错 Cloning into MiniGPT-4... error: RPC failed; curl 28 OpenSSL SSL_read: Connection was reset, errno 10054 fatal: the remote end hung up unexpectedly解决办法 先 git config --global http.sslVerify "false"然后再clone就好了…

Android-推荐一个RecyclerView悬浮头部(StickyItemDecoration)

在日常Android列表开发当中&#xff0c;我们可能会遇到以下的需求&#xff1a; 我们在滑动列表的时候&#xff0c;头部View置顶不可以滑动. 我刚好看到有一个开源库可以帮我们快速实现,分享出来希望能提高看文章的小伙伴的开发效率. StickyItemDecoration StickyItemDecoration…

三极管开关电路限流电阻怎么选取

这是一个MCU驱动小功率器件的电路&#xff0c;这里仅用小功率灯珠代替负载&#xff0c;电路中用到了一个NPN的三极管&#xff0c;这个三极管在这里充当一个开关。 三极管当作开关时其工作在饱和状态&#xff0c;BE间的电压要大于开启电压&#xff0c;同时BE间的电压大于CE间的电…