TS 进阶类型

联合类型 |

当 TS 不确定一个联合类型的变量到底是哪个类型的时候,可以定义多种类型,例如,一个变量既支持 number 类型,又支持 string 类型.

let num: 类型1 | 类型2 | 类型3 .... = 初始值
let num:number | string = 1 // 可以写多个类型 // 1|'2' 在这里的1 和 '2‘是类型, 常量,表示numAndStr2的值只能是 1 或 '2'
let numAndStr2: 1|'2' = 1
let numAndStr3: 1|'2' = '2'// 表明obj必须要有a 或 b属性,并且a的类型为1,或b的类型为'3'(可以a、b都有)
let obj:{a:1}|{b:'3'} = {a: 1};

交叉类型 &

对已有的类型进行扩展

// 交叉类型 
let obj:{name: string, age:number} & {height: number};
obj = {name: 'll', age: 19, height: 20} // 属性必须全部要有,少了一个都报错// 如果一个属性出现多次类型的设置,必须都要满足才行
let obj1:{name: string, age:number} & {height: number, age: 18};
// obj1 = {name: 'xiaotian', age: 19, height: 20} // 报错, age不满足18
obj1 = {name: 'll', age: 18, height: 20}

联合类型 | 是指可以取几种类型中的任意一种,而交叉类型 & 是指把几种类型合并起来。

TS泛型

type Person = {name: string;age: number;id: number;
}// Pick 挑选出指定属性,生成新对象类型
type UserInfo = Pick<Person, 'name' | 'age'>; // 挑选出 { name: string; age: number }// Omit 排除指定的属性,生成新的对象类型
type UserInfo2 = Omit<Person, 'id'>; // 排除 id,生成  { name: string; age: number }// Partial 将对象所有属性变为可选
type PartialPerson = Partial<Person>; // { name?: string; age?: number; id?: number }// Readonly 将对象所有属性变为只读
type ReadonlyPerson = Readonly<Person>; // { readonly name: string; readonly age: number; readonly id: number }// Record 生成对象类型,例如
type PersonMap = Record<number, Person>; // { [index: number]: Person }// Exclude 排除一些联合类型
type UserInfoKeys = Exclude<keyof Person, 'id'>; // 'name' | 'age'

属性修饰
对象的属性是可以有修饰符的,目前有两种修饰符,分别是 readonly 关键字对应的可选属性 和 ?: 对应的可选属性.

type Person = {name: string;age?: number; // 1、可选属性readonly id: number; // 2、只读属性
}const person: Person = {name: '张三',id: 1,// 没有 age 属性,不报错,说明 age 可选
}person.id = 2; // 报错,不能修改只读属性
person.age = 18; // 正常

类型的父子关系
类型是有父子关系的,子类型的值可以赋值给父类型,但是父类型的值是不能够赋值给子类型的.

type ParentType = 1 | 2 | string
type SubType = 1
//SubType 是 ParentType 的 父级let parentData: ParentType = 2;
let subData: SubType = 1;subData = parentData; // ❌ 父类型不能赋值给子类型的值
parentData = subData; // 🆗

对象类型的遍历
把所有的属性都加上 readonly 修饰符

// ts 类型对象遍历
type Person = {name: string;age?: number;readonly id: number;
}type Readonly<T> = {readonly [Key in keyof T]: T[Key];
}

keyof 关键字可以获取到对象所有的属性(前面讲过)
Key 就是每次遍历时存的属性名
T[Key] 就是每次遍历时存的属性值
然后我们在每个属性前面加上了 readonly 这样所有的属性都是只读的了

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

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

相关文章

C++笔试强训day34

目录 1.ISBN号码 2.kotori和迷宫 3.矩阵最长递增路径 1.ISBN号码 链接https://www.nowcoder.com/practice/95712f695f27434b9703394c98b78ee5?tpId290&tqId39864&ru/exam/oj 提取题意&#xff0c;模拟一下即可。 #include <iostream> using namespace std; …

学习笔记:C语言的32个关键字

一、标准C语言的32个关键字 1、基本数据类型&#xff1a; signed unsigned char int float double short long void 2、构造数据类型&#xff1a; struct union enum 3、数据存储类别&#xff1a; auto static extern register 4、数据优化&#xff1a; const volatile 5、9条…

Java(其十二)--集合·初级

ArrayList集合 集合有很多种&#xff0c;ArrayList 是最常用的一种&#xff0c;集合的作用相当于C中的STL 最显著的特点就是&#xff1a;自动扩容。 一般定义式 ArrayList list new ArrayList(); //该 list 是可以储存各种类型的数据的&#xff0c;要想约束储存的数据&#x…

买车是小米su7还是model3?这个AI在我这里“干掉了”百万车评人

作者 | 曾响铃 文 | 响铃说 43天交付1万辆新车&#xff01;雷军的微博一发&#xff0c;又把小米汽车推上了热搜。 自小米su7问世以来&#xff0c;天天刷屏。说不心动&#xff0c;那是假的&#xff0c;身边好几个朋友都按捺不住要下订一台了。 但真要买&#xff0c;还是忍不住…

[回溯法]子集和数问题

没有任何优化&#xff0c;纯深搜做法&#xff1a; #include<iostream> #include<vector> using namespace std;const int N 100010; int nums[N],selected[N]; int n,M,sum; bool ansfalse;void Out() {for (int i 0; i < n - 1; i)printf("%d", …

Gateway+Oauth2授权码登录

在Oauth服务中配置 @Override protected void configure(HttpSecurity http) throws Exception {http.csrf().disable().formLogin().permitAll().and()//主要配置好.formLogin().authorizeRequests().requestMatchers(EndpointRequest.toAnyEndpoint()).permitAll().antMatche…

强大的医院绩效考核管理系统源码,支持行业内所有绩效方案,且每步核算都可自主进行方案的新建、调整。

医院绩效考核管理系统是采用B/S架构模式设计、使用JAVA语言开发、后台使用MySql数据库进行管理的一整套计算机应用软件源码。 系统和his系统进行对接&#xff0c;按照设定周期&#xff0c;从his系统获取医院科室和医生、护士、其他人员工作量&#xff0c;对没有录入信息化系统…

YOLOv10:全面的效率-准确性驱动模型设计

YOLOv10&#xff1a;全面的效率-准确性驱动模型设计 提出背景精细拆分解法双重标签分配一致的匹配度量以效率为导向的模型设计 YOLO v10 总结1. 双重标签分配策略2. 一致匹配度量策略 论文&#xff1a;https://arxiv.org/pdf/2405.14458 代码&#xff1a;https://github.com/T…

今日选题。

诱导读者点开文章的9引真经&#xff08;一&#xff09; 标题重要么&#xff1f;新媒体、博客文通常在手机上阅读。首先所有的内容不同于纸媒&#xff0c;手机只展现标题&#xff0c;而内容都是折叠。其次读者能像看内容一样看4、5条或者7、8条标题&#xff08;区别于不同的主流…

微信小程序实现计算当前位置到目的地的距离

实现方式&#xff1a;使用腾讯位置服务 微信小程序JavaScript SDK | 腾讯位置服务 1.进腾讯位置服务申请key 2.下载sdk 微信小程序JavaScript SDK | 腾讯位置服务 3.微信公众平台添加授权域名 4.代码实现计算 const qqmap require("../../utils/qqmap-wx-jssdk.min.js…

一键部署Ollama和粘土模型?快来看看吧!

厚德云新上两款AI软件&#xff01;无需部署一键生成&#xff01; 前言 上新Ollama与粘土模型 就在5月23日&#xff0c;厚德云官方上新了Ollama开源大语言模型与粘土画风模型。它们都可以在平台上实施一键部署&#xff0c;那么这两款AI应用究竟有什么样的魅力呢&#xff1f;我们…

Agent 如何更有用

先看这篇会更连贯 Agent的记忆能力 学习来源 LLM的基础能力 1、复杂任务的规划和分解 2、遵循复杂指令 3、自主使用工具 4、减少幻觉 一两个人就能开发的有用AI AI的优势&#xff1a;长文本的阅读理解能力、广阔的知识面。 1、导游&#xff1a;GPT-4知道很多著名景点&…

2024年4k激光投影仪购买指南:618推荐家用4K激光投影当贝X5 Pro

2024年的618已经悄然开始热度也在持续攀升&#xff0c;每年的大促节点是投影仪优惠力度最大的时候&#xff0c;很多消费者都会选择在这个时候去购买心仪的投影仪&#xff0c;想要投影放在客厅使用替代电视机的&#xff0c;一般都会去选择4K激光投影&#xff0c;如何挑选一款极具…

推荐3款好用的AI智能写作工具

AI智能写作如今已经很成熟了&#xff0c;不仅有很多AI综合大模型可以实现AI写作&#xff0c;还有很多专门针对AI写作场景专门研发的垂直领域工具。 如果你在工作学习中也想提高写作效率&#xff0c;不妨试试下面3个国内可直接登录使用的AI写作工具&#xff0c;其中不乏有简单易…

CentOS7 部署单机版 ElasticSearch + Logstash + Kibana

一、部署ElasticSearh 参考下面文章&#xff1a; CentOS7 部署单机版 ElasticSearch Logstash-CSDN博客文章浏览阅读83次&#xff0c;点赞2次&#xff0c;收藏2次。通过logstash收集信息&#xff0c;发送给elasticsearch处理。https://blog.csdn.net/weixin_44295677/articl…

linux下使用doxygen和grapviz生成函数调用关系图

1&#xff0c;参考链接 https://jasoncc.github.io/doc_tools/doxygen.html 2&#xff0c;操作流程 以ubuntu为例&#xff0c;执行如下命令来生成doxygen $ sudo apt-get install doxygen $ sudo apt-get install graphviz $ mkdir /tmp/doxygen && cd /tmp/doxygen…

详解PHP弱类型安全问题

弱类型的语言对变量的数据类型没有限制&#xff0c;你可以在任何地时候将变量赋值给任意的其他类型的变量&#xff0c;同时变量也可以转换成任意地其他类型的数据。这时候在类型转化、不同类型比较、不合理地传参&#xff0c;会造成意外执行结果和绕过防御。 一. 类型转换 …

同一个项目下如何使用多个 Dockerfile

同一个项目下可以使用多个 Dockerfile。这在需要为不同环境、用途或配置创建不同的 Docker 镜像时非常有用。以下是如何管理和使用多个 Dockerfile 的方法&#xff1a; 方法一&#xff1a;使用不同的文件名 你可以为每个 Dockerfile 使用不同的文件名&#xff0c;例如 Docker…

ctfshow web入门 web306--web310源码审计

web306 这和之前的完全不一样了 <?php #error_reporting(0); session_start(); require service.php;$username$_POST[userid]; $userpwd$_POST[userpwd]; $servicenew service();$user$service->login($username,$userpwd); if($user){setcookie(user,base64_encode(…