TypeScript 中的高级类型(联合、交叉、泛型、映射类型)

文章目录

  • 一、联合类型(Union Types)
  • 二、交叉类型(Intersection Types)
  • 三、泛型
    • 3.1 泛型结合extends
    • 3.2 泛型结合 keyof
    • 3.3 extends keyof 和 in keyof 的区别
  • 四、条件类型(Conditional Types)

TypeScript 中的高级类型为开发人员提供了更多强大的工具,用于处理复杂的类型场景

一、联合类型(Union Types)

联合类型允许一个变量具有多种不同类型中的一种。这在需要处理多个类型可能值的情况下非常有用,关键字符|

function fn(data:string|number){console.log(data)
}
fn(1);
fn('abc')

二、交叉类型(Intersection Types)

交叉类型将多个类型合并为一个新的类型。这对于创建新的对象类型或混合现有对象类型非常有用,关键字符&

nterface  Cat{name:string,age:number
}interface Dog{runningSpeed:number
}type Bird  = Cat & Dog;const bird:Bird = {name:'xixi',age:2,runningSpeed:10
}

三、泛型

泛型是一种特殊的类型,它可以用来创建可重用的组件,这些组件可以支持多种类型。泛型使得我们能够编写更灵活、更健壮的代码,同时使代码更易于维护和重用。

function fn<T>(arg: T): T {return arg;
}// 使用方式
let output = fn<string>("hello");

在上面的例子中,<T> 表示这个函数使用了一个泛型类型 T,它表示这个函数可以适用于任意类型。当我们调用 fn 函数时,我们可以指定具体的类型,也可以让 TypeScript 根据参数类型进行推断。

3.1 泛型结合extends

通过使用 extends,我们可以约束泛型的范围,从而达到增强类型检查和提高代码健壮性的目的。

interface Len {length: number;
}function fn<T extends Len>(name: T): number {return name.length;
}
fn("123");
fn([1,2,3]);

在上面的例子中,<T> 表示这个函数使用了一个泛型类型 T,T传入的类型,可以有其他属性,但必须有length这个属性。

3.2 泛型结合 keyof

keyof 是 TypeScript 中的一个操作符,它用于获取对象类型的所有键

interface Cat{name: string;age: number;
}type keysType = keyof Cat;    //等同于 type keysType = 'name' | 'age' 
interface Person {name: string;age: number;
}function person<T extends Person, K extends keyof T>(obj: T, key: K): T[K] {return obj[key];
}console.log(person({ name: "qiyan", age: 18 }, "name"));

在上面的例子中,通过使用泛型 K extends keyof T,我们确保了 key 参数必须是对象 T 的一个键

3.3 extends keyof 和 in keyof 的区别

  • extends keyof 组合通常用于泛型约束,它可以限制泛型变量必须是某个特定类型的键之一
interface Person {name: string;age: number;
}function person<T extends Person, K extends keyof T>(obj: T, key: K): T[K] {return obj[key];
}

K extends keyof T 表示泛型 K 必须是类型 T 的键之一。这样,在使用 person函数时,传入的 key 参数必须是对象 T 的一个有效键,否则 TypeScript 将会给出类型检查错误。

  • in keyof 通常用于迭代类型中的所有键,并生成新的类型
    在这里插入图片描述
    上面in keyof这种类型称为映射类型,基于旧类型创建新类型(对象类型),减少重复、提升开发效率

四、条件类型(Conditional Types)

条件类型允许根据类型关系选择要使用的类型。这在泛型类型的操作中非常有用

type A<T> = T extends null | undefined ? never : T;type B= string | null | undefined;
type C= A<B>; // string

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

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

相关文章

Zookeeper-快速开始

Zookeeper介绍 简介&#xff1a;ZooKeeper 是一个开源的分布式协调框架&#xff0c;是Apache Hadoop 的一个子项目&#xff0c;主要用来解决分布式集群中应用系统的一致性问题。 设计目标&#xff1a;将那些复杂且容易出错的分布式一致性服务封装起来&#xff0c;构成一个高效…

JAVAEE初阶 多线程进阶(一)

进阶面试题 一. 锁拓展1.1 乐观锁与悲观锁1.2 轻量级锁与重量级锁1.3 自旋锁和挂起等待锁1.4 普通互斥锁与读写锁1.5 公平锁与非公平锁1.6 可重入锁和不可重入锁 二.锁的优化策略2.1 锁的自适应2.2 锁消除2.3 锁粗化 三.CAS 一. 锁拓展 1.1 乐观锁与悲观锁 乐观锁 : 加锁前,预…

Elasticsearch——快速入门

从零基础的内容开始介绍Elasticsearch&#xff0c;主要包含以下内容&#xff1a; Elasticsearch的定义、优点&#xff0c;以及典型的业务场景。Elasticsearch中重要的概念。Elasticsearch典型的接入方式。安装Elasticsearch。使用Kibana调试Elasticsearch。Elasticsearch节点的…

保护IP地址免受盗用的有效方法

IP地址是互联网通信的基础&#xff0c;然而&#xff0c;由于其重要性&#xff0c;IP地址的盗用成为一种潜在的网络威胁。本文将深入探讨防止IP地址被盗用的方法&#xff0c;以维护网络的安全性。 第一部分&#xff1a;IP地址盗用的威胁与风险 1.1 IP地址盗用的定义 IP地址盗…

软件测试必备的测试工具清单汇总

前言 据统计&#xff0c;中国软件外包市场的潜力和机会已远远超过软件王国印度&#xff0c;不过由于软件人才的严重不足致使我国软件发展遭遇“瓶颈”。国家为了大力培养软件人才&#xff0c;不断采取积极有效的措施。我国对软件测试人才的需求数量还将持续增加&#xff0c;因…

【MAC】M2 安装docker 与 mysql

一、docker下载地址 下载地址 二、安装docker完成 罗列一下docker常用命令 # 查看docker版本 docker --version# 拉取镜像 docker pull 镜像名# 查看当前所有镜像 docker images# 查看运行中的容器 docker ps -a docker ps grep| 镜像名#镜像启动操作&#xff1a; sudo dock…

使用单向链表实现栈的相关操作【1.2】

创建节点: class StackNode {private StackNode next;private int no;public StackNode getNext() {return next;}public void setNext(StackNode next) {this.next next;}public StackNode(int no) {this.no no;}public int getNo() {return no;}public void setNo(int no)…

Day65力扣打卡

打卡记录 寻找峰值 II&#xff08;二分&#xff09; 链接 class Solution:def findPeakGrid(self, mat: List[List[int]]) -> List[int]:l, r 0, len(mat) - 1while l < r:mid (l r) // 2mx max(mat[mid])if mx > mat[mid 1][mat[mid].index(mx)]:r midelse:l…

linux搭建gitlab

gitlab的介绍 区别于github&#xff0c;github是面向互联网基于git实现的代码托管平台&#xff0c;gitlab是基于Ruby语言实现的git管理平台软件&#xff0c;一般用于公司内部代码仓库。 gitlab组成 gitlab组成 Nginx 静态Web服务器Gitlab-workhorse 轻量级的反向代理服务器Git…

五年一贯专转本这么管用的记忆法你用了吗?

在枯燥无聊的学习当中&#xff0c;能有好的学习记忆方式就能事半功倍&#xff0c;但是怎样的学习记忆方式才适合我们呢&#xff1f;那我今天就给大家介绍一下吧&#xff0c;如果觉得好用&#xff0c;可以试试&#xff0c;让我们在之后的转本考试当中能有个好成绩&#xff01;zb…

R10在工业自动化-485转WiFi无线路由解决方案

R10是钡铼技术有限公司研发的一款用于工业自动化应用的485转WiFi无线路由器解决方案。该解决方案可以将传统的RS485通信设备无线化&#xff0c;实现数据的远程监控和管理。下面将详细介绍R10在工业自动化中的应用。 首先&#xff0c;R10具备RS485转WiFi的功能&#xff0c;可以…

Apache CouchDB 垂直权限绕过漏洞 CVE-2017-12635 已亲自复现

Apache CouchDB 垂直权限绕过漏洞 CVE-2017-12635 已亲自复现 漏洞名称影响版本影响版本 漏洞复现环境搭建漏洞利用 总结 漏洞名称 影响版本 Apache CouchDB是一个开源的NoSQL数据库&#xff0c;专注于易用性和成为“完全拥抱web的数据库”。它是一个使用JSON作为数据存储格式…