TypeScript——泛型

泛型(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 | Tlet a: A<boolean> = true
let a1: A<undefined> = undefined

泛型接口

interface Person<T, U> {name: Tage: 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: stringage: numbersex: 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.hqwc.cn/news/1106.html

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

相关文章

吉他如何实现内录or通过转接头和简易声卡连接电脑没有声音怎么办

目录 效果器or智能音箱 电吉他和效果器的连接 效果器和耳机or音箱连接 内录方法 为什么用6.5mm&#xff08;入&#xff09;转3.5mm&#xff08;出&#xff09;转接头内录无声音 整体连接图示 这篇文章我会以通俗的语言为初学者描述如何让电吉他“燃起来”&#xff0c;效果…

Idea项目application.properties配置文件默认GBK,如何设置默认为UTF-8编码

简述&#xff1a;java程序在项目中一般设置都是UTF-8编码格式&#xff0c;但是项目application.properties 文件默认是GBK,需要手工修改默认编码格式 步骤&#xff1a; file->setting->editor->file encodings下&#xff0c;勾选transparent native-to-ascll conver…

亚马逊云科技以用户为中心,持续丰富安全服务和解决方案

AI加持安全&#xff0c;自动化运营成未来趋势 亚马逊云科技始终在云安全领域不断创新探索、深耕发力&#xff0c;随着全球技术的发展而持续迭代安全能力。 当下&#xff0c;以ChatGPT为代表的AIGC成为最出圈的热点&#xff0c;大量的科技巨头纷纷涌入AI赛道&#xff0c;投入了…

森海塞尔重磅推出TC Bars智能音视频一体机, 为中小型协作空间缔造理想解决方案

森海塞尔重磅推出TC Bars智能音视频一体机&#xff0c; 为中小型协作空间缔造理想解决方案 全球音频行业先驱森海塞尔重磅推出首款内置摄像头的可扩展一体化会议设备 德国韦德马克&#xff0c;2023年6月13日——森海塞尔作为先进音频技术的首选&#xff0c;致力于使协作与学习…

Clickhouse物化视图原理和使用详解

前言 ClickHouse广泛用于用户和系统日志查询场景中&#xff0c;主要针对于OLAP场景&#xff0c;为业务方提供稳定高效的查询服务。在业务场景下&#xff0c;数据以不同的格式、途径写入到clickhouse。用传统JOIN方式查询海量数据&#xff0c;通常有如下痛点: 每个查询的代码冗…

RabbitMQ灵活运用,怎么理解五种消息模型

RabbitMQ灵活运用&#xff0c;怎么理解五种消息模型 简介一、AMQP协议二、交换机类型与默认交换机1. 交换机的四种类型2. 默认交换机 三、五种模式速览1. 一对一简单模式2. work模式&#xff08;轮询&#xff09;3. 发布/订阅模式4. 路由模式&#xff08;自称direct模式&#x…

Redis 简介与数据类型介绍

目录 ​编辑 一、Redis是什么&#xff1f; 二、redis五大基本类型 2.1 String(字符串) 2.1.1 应用场景 1&#xff09;缓存功能 2&#xff09;计数器 3&#xff09;统计多单位的数量 4&#xff09;共享用户session 2.2 List(列表) 2.2.1 应用场景 1&#xff09;消息队列 2…

Python学习—装饰器的力量

Python学习—装饰器的力量 作为许多语言都存在的高级语法之一&#xff0c;装饰器是你必须掌握的知识点。 Python的装饰器&#xff08;Decorator&#xff09;允许你扩展和修改可调用对象&#xff08;函数、方法和类&#xff09;的行为&#xff0c;而无需永久修改可调用的对象本身…

蓝桥杯专题-试题版-【龟兔赛跑预测】【回形取数】【阶乘计算】【矩形面积交】

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 &#x1f449;关于作者 专注于Android/Unity和各种游…

高性能消息中间件 RabbitMQ

一、RabbitMQ概念 1.1 MQ是什么 消息队列 MQ全称Message Queue&#xff08;消息队列&#xff09;&#xff0c;是在消息的传输过程中保存消息的容器。多用于系统之间的异步通信。 同步通信相当于两个人当面对话&#xff0c;你一言我一语。必须及时回复&#xff1a; 异步通信相…

Spring是什么?

目录 1、Spring的简介 2、Spring七大功能模块 3、Spring的优点 4、Spring的缺点 5、Sprig容器 6、Spring的生态圈&#xff08;重点&#xff09;***** 7、Spring中bean的生命周期 1、Spring的简介 Spring的英文翻译为春天&#xff0c;可以说是给Java程序员带来了春天&…

chatgpt赋能python:关于Python除二取余法的优缺点分析

关于Python除二取余法的优缺点分析 Python是当前数据分析和科学计算最火热的语言之一&#xff0c;其中除二取余法是Python中很有趣的算法之一。它也是很常用的基础算法之一&#xff0c;特别是在图像处理和编码中&#xff0c;非常常用。除二取余法指的是一个数值除以二后的余数…