TS的高级类型

1.索引类型
学习索引类型 首先要了解keyof(索引查询) Tk 和泛型约束

1.keyof索引查询
就是用来获取某个类型的所有键(键值对的那个键).

interface IPerson {name: string;age: number;
}
type Test = keyof IPerson; //'name'|"age"

这就相当于获得了IPerson里面的键也就是 是name和age。

2.T[K] 索引访问
就是获取接口T的K属性所代表的类型.

interface IPerson {name: string;age: number;
}let type1:  IPerson['name'] 
let type2:  IPerson['age'] 
这样输出的就是string和age了

索引类型就是从对象中抽取一些属性的值 然后拼接成数组

const userInfo = {name: 'lin',age: '18',
}function getValues(userInfo: any, keys: string[]) {return keys.map(key => userInfo[key])
}// 抽取指定属性的值
console.log(getValues(userInfo, ['name','age']))  // ['lin', '18']
// 抽取obj中没有的属性:
console.log(getValues(userInfo, ['sex','outlook']))  // [undefined, undefined]
这个代码的意思就是 定义了一个对象和一个函数

这个函数得两个形参 第一个是任意类型的userInfo对象 第二个就是字符串类型的数组

通过对第二个形参输入的值遍历去寻找到userInfo中相同的属性的值打印出来

即使userinfo中没有这个属性也不会报错 只会输出undefind

3.检查动态属性
const userInfo = {name: 'lin',age: '18',function getValues<T, K extends keyof T>(userInfo: T, keys: K[]): T[K][] {return keys.map(key => userInfo[key])
}
这个代码的意思是 定义了一个函数 他是有两种可能的类型 T 和 k

T是用来约束userinfo的 k是用来约束keys的

而K泛型继承了 userinfo的属性

所以当我们要调用这个函数时 形参需要输入的属性名是得符合userinfo中的两个属性名 否则就会报错

2.映射类型

TS允许将一个类型映射成另外一个类型1.in
in操作符,用来对联合类型实现遍历。type Person = "name" | "school" | "major"type Obj =  {[p in Person]: string
}
2.Partial
Partial<T>T的索引属性映射为可选的。interface IPerson {name:stringage:number
}
let P1: IPerson = {name:'lin',age:18
}
使用了IPerson接口,就一定要传name和age属性。使用 Partial 改造一下,就可以变成可选属性,interface IPerson {name:stringage:number
}
type IPartial = Partial<IPerson>
let p1: IPartial = {}
Parital 原理Parital 的实现用到了in和keyoftype Partial<T> = {[P in keyof T]?: T[P]
}
[P in keyof T]遍历T 上的所有属性?:设置为属性为可选的T[P]`设置类型为原来的类型3.Readonly
和Partial几乎完全一样Readonly<T>将T的所有属性映射为只读的,例如:/*** Make all properties in T readonly*/
type Readonly<T> = {readonly [P in keyof T]: T[P]
}
[P in keyof T]遍历T`上的所有属性

readonly`设置为属性为可选的

T[P]`设置类型为原来的类型

4.Pick
Pick用于抽取对象子集,挑选一组属性并组成一个新的类型interface IPerson {name:stringage:numbersex:string
}
type IPick = Pick<IPerson.'name' | 'age'>let p1:IPick = {name:'lin',age:18
}
这样就把name和age从IPerson中抽取出来。5.Record原理
/*** Construct a type with a set of properties K of type T*/
type Record<K extends keyof any, T> = {[P in K]: T
}
Record映射类型有两个参数:第一个参数可以传入继承于uany的任何值。
第二个参数,作为新创建对象的值,被传入。3.条件类型
Exclude和Extrcat的实现就用到了条件类型。1.Exclude
/*** Exclude from T those types that are assignable to U*/
type Exclude<T, U> = T extends U ? never : T
never表示一个不存在的类型never与其他类型的联合后,为其他类型type Test = string | number | never  
2.Extract
Extract<T,U>提取联合类型T和联合类型U的所有交集.type Test = Extract<'key1' | 'key2', 'key1'>/*** Extract from T those types that are assignable to U*/
type Extract<T, U> = T extends U ? T : never


4.工具类型
为了方便开发者使用, TypeScript 内置了一些常用的工具类型。

上文介绍的索引类型、映射类型和条件类型都是工具类型。

1.Omit
Omit<T,U>从类型T中剔除U中的所有属性。interface IPerson {name:stringage:number
}
type IOmit = Omit<IPerson,'age'>
这样就剔除了 IPerson 上的 age 属性。他和pick有点相反 它的原理

type Omit<T, K extends keyof any> = 
Pick<T, Exclude<keyof T, K>>2.NonNullable
NonNullable<T> 用来过滤类型中的 nullundefined 类型。type T0 = NonNullable<string | number | undefined>; // string | number
type T1 = NonNullable<string[] | null | undefined>; // string[]
原理type NonNullable<T> =  T extends null |  undefined ?never : T
never 表示一个不存在的类型never与其他类型的联合后,为其他类型3.Parameters
Parameters获取函数的参数类型,将每个参数类型放在一个元祖中。type T1 = Parameters<() => string>  // []type T2 = Parameters<(arg: string) => void>  // [string]type T3 = Parameters<(arg1: string, arg2: number) => void> // [arg1: string, arg2: number]
Parameters原理​
type Parameters<T extends (...args: any) => any> = 
T extends (...args: infer P) => any ? P : never
在条件类型语句中,可以用 infer 声明一个类型变量并且对它进行使用。Parameters首先约束参数T`必须是个函数类型

判断T是否是函数类型,如果是则使用infer P暂时存一下函数的参数类型,后面的语句直接用 P 即可得到这个类型并返回,否则就返回never

4.ReturnTypeReturnType获取函数的返回值类型type T0 = ReturnType<() => string>  // stringtype T1 = ReturnType
<(s: string) => void>  // void
ReturnType原理/*** Obtain the return type of a function type*/
type ReturnType<T extends (...args: any) => any> = 
T extends (...args: any) => infer R ? R : any
懂了 Parameters,也就懂了 ReturnType,

ReturnType首先约束参数T必须是个函数类型

判断T是否是函数类型,如果是则使用infer R暂时存一下函数的返回值类型,后面的语句直接用 R 即可得到这个类型并返回,否则就返回any

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

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

相关文章

Redis集群搭建(Linux)

安装Redis tar -xzvf redis-6.2.14.tar.gz下载redis wget https://download.redis.io/releases/redis-6.2.14.tar.gz创建目录 cd /home/jnredis mkdir redis 把redis-6.2.14.tar.gz移入/home/jnredis/redis目录下 解压 tar -xzvf redis-6.2.14.tar.gz编译安装 cd redis-…

Live800:深度解析,客户服务如何塑造品牌形象

在当今竞争激烈的市场环境中&#xff0c;品牌形象对于企业的成功至关重要。而客户服务作为品牌与消费者之间最直接的互动方式&#xff0c;不仅影响着消费者的购买决策&#xff0c;更在塑造品牌形象方面发挥着不可替代的作用。本文将深度解析客户服务如何塑造品牌形象&#xff0…

C++协程

什么是协程 协程&#xff08;Coroutine&#xff09;是程序组件&#xff0c;可以在执行过程中暂停并在稍后继续执行。与传统的子例程&#xff08;如函数或过程&#xff09;不同&#xff0c;子例程一旦调用&#xff0c;必须等其返回后才能继续执行调用它的代码。协程则可以在执行…

填充每个节点的下一个右侧节点指针-力扣

本题使用BFS对二叉树进行搜索&#xff0c;然后将每个节点的next指向右侧节点&#xff0c;当节点为一层的最后也给节点时&#xff0c;将其next指向nullptr。 /* // Definition for a Node. class Node { public:int val;Node* left;Node* right;Node* next;Node() : val(0), le…

【Unity3D小功能】Unity3D中UGUI-Text实现打字机效果

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址QQ群&#xff1a;398291828 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 需求要实现Text的打字机效果&#xff0c;一看居然…

机器学习作业6——svm支持向量机

目录 一、理论 概念&#xff1a; 线性可分&#xff1a; 支持向量&#xff1a; 间隔&#xff1a; 目标&#xff1a; 软间隔&#xff1a; 梯度下降法&#xff1a; 别的方法&#xff1a; 拉格朗日函数&#xff1a; SMO算法&#xff1a; 核函数&#xff1a; 二、代码 …

python代码中参数的默认值

python中的函数&#xff0c;可以给形参指定默认值。 带有默认值的参数&#xff0c;可以在调用的时候不传参。 如上图所示&#xff0c;在给函数设定形参的时候可以给函数形参设定默认值&#xff0c;当然默认参数的形参应该在非默认形参的后面。 如果在调用函数的时候&#xff…

Android输入法IME(三)之 管理端(IMMS)启动流程

2.2. IME管理端&#xff08;IMMS&#xff09;初始化流程 IMMS运行在system server进程中&#xff0c;属于系统服务的一部分&#xff0c;用于控制输入法的显示/隐藏、切换、绑定等操作。 涉及代码文件路径&#xff1a; IMMS运行在system server进程中&#xff0c;属于系统服务的…

Linux云计算架构师涨薪班就业服务有哪些?

学员一站式就业服务:一次学习&#xff0c;薪资翻倍 简历制作与指导 学员在培训期间&#xff0c;人才顾问会提供简历制作和指导服务&#xff0c;帮助学员制作出一份专业、有吸引力的简历。简历是求职者给招聘单位的第一印象&#xff0c;因此非常重要 模拟面试与技巧指导 为了让…

WebGPU 引领前端未来,互动渲染如何驱动小红书业务增长?

在大前端时代&#xff0c;浏览器能力得到显著的增强&#xff0c;为前端开发带来了更多的可能性和挑战。作为一套全新的 Web API 标准&#xff0c;WebGPU 旨在提供高性能的 3D 图形和数据并行计算能力&#xff0c;其在游戏、虚拟现实、机器学习等多个行业和应用场景中展现出潜力…

嵌入式Linux系统编程 — 3.2 stat、fstat 和 lstat 函数查看文件属性

目录 1 文件有哪些属性 2 stat函数 2.1 stat函数简介 2.2 struct stat 结构体 2.3 struct timespec 结构体 2.4 示例程序 3 fstat 和 lstat 函数 3.1 fstat 函数 3.2 lstat 函数 1 文件有哪些属性 Linux文件属性是对文件和目录的元数据描述&#xff0c;包括文件类型…

30-unittest生成测试报告(HTMLTestRunner插件)

批量执行完测试用例后&#xff0c;为了更好的展示测试报告&#xff0c;最好是生成HTML格式的。本文使用第三方HTMLTestRunner插件生成测试报告。 一、导入HTMLTestRunner模块 这个模块下载不能通过pip安装&#xff0c;只能下载后手动导入&#xff0c;下载地址是&#xff1a;ht…

应用广义线性模型一|线性模型

文章目录 一、统计学及思维模式二、未知现象的数学描述三、线性模型&#xff08;一&#xff09;线性模型的定义&#xff08;二&#xff09;线性模型的参数估计&#xff08;三&#xff09;线性模型的应用&#xff08;四&#xff09;离散解释变量的设计向量构建方法 四、线性模型…

SpringAOP 常见应用场景

文章目录 SpringAOP1 概念2 常见应用场景3 AOP的几种通知类型分别有什么常见的应用场景4 AOP实现 性能监控4.1 首先&#xff0c;定义一个切面类&#xff0c;用于实现性能监控逻辑&#xff1a;4.2 定义自定义注解4.3 注解修饰监控的方法 5 AOP实现 API调用统计5.1 定义切面类&am…

mod_aws_transcribe

这里讲的很清楚&#xff1a; https://github.com/drachtio/drachtio-freeswitch-modules/blob/main/modules/mod_aws_transcribe/README.md sdk 到这里下载&#xff1a; https://github.com/aws/aws-sdk-cpp sdk 编译步骤&#xff1a; cd /usr/src git clone --recurse-subm…

深度图的方法实现加雾,Synscapes数据集以及D455相机拍摄为例

前言 在次之前&#xff0c;我们已经做了图像加雾的一些研究&#xff0c;这里我们将从深度图的方法实现加雾展开细讲 图像加雾算法的研究与应用_图像加雾 算法-CSDN博客 接下来将要介绍如何使用深度图像生成雾效图像的方法。利用Synscapes数据集&#xff0c;通过读取EXR格式的…

【实盘】第二十期:2024-06月~第一周

一、每周净值 01 CTA投资组合 CTA多品种全覆盖全天候策略2024年2月至2024年5月底实盘总收益12.753%&#xff0c;当前浮动净值为1.1407&#xff0c;当前平仓净值为1.12753。 月度最大本金回撤0.3%(资金曲线为平仓盈亏,总体回撤应加入浮动持仓的盈亏总体计算,实际当前净值见棕色…

【CS.SE】Tomcat启动闪退问题解决方法

文章目录 1. 引言2. 常见问题及解决方法2.1 环境变量配置错误2.1.1 问题描述2.1.2 解决方法2.1.3 示例 2.2 端口冲突2.2.1 问题描述2.2.2 解决方法2.2.3 示例 2.3 权限问题2.3.1 问题描述2.3.2 解决方法2.3.3 示例 2.4 内存设置不当2.4.1 问题描述2.4.2 解决方法2.4.3 示例 2.5…

typescript-类型别名

typescript-类型别名 类型别名声明 类型别名声明能够定义一个类型别名type AliasName Type type Point {x: number; y: number} type StringType string; type BooleanType true | false type Point {x: number; y: number; z?: number}类型别名不会创建出一种新的类型…

自动驾驶算法——提取点云障碍物轮廓—DBSCAN聚类算法

前言 最近在做项目过程中,我们注意到当考虑车体轮廓去进行全局路径规划(如混合A*算法),如果仅仅将障碍物点云数据中得每一个点只当成点,会造成较大的计算时间,如若将点云聚类成圆形 线型 多边形障碍物 会提高计算效率,这是其中一个原因,另一个原因是,我们需要知道障碍…