技术标签: Typescript TypeScript面向类型编程 typescript 高级类型 面向类型编程 Partial
预备知识:
先来看一下 Partial
类型的定义
/**
* Make all properties in T optional
*/
type Partial<T> = {
[P in keyof T]?: T[P];
};
假设我们有一个定义 user
的接口,如下
interface IUser {
name: string
age: number
department: string
}
经过 Partial
类型转化后得到
type optional = Partial<IUser>
// optional的结果如下
type optional = {
name?: string | undefined;
age?: number | undefined;
department?: string | undefined;
}
那么 Partial<T>
是如何实现类型转化的呢?
遍历入参 T
,获得每一对 key, value
将每一对中的 key
变为可选,即添加 ?
希望得到的是由 key, value
组成的新类型
以上对应到 TypeScript
中是如何实现的呢?
对照最开始 Partial
的类型定义,能够捕捉到以下重要信息
keyof
是干什么的?
in
是干什么的?
[P in keyof T]
中括号是干什么的?
?
是将该属性变为可选属性
T[P]
是干什么的?
keyof
keyof
,即 索引类型查询操作符
,我们可以将 keyof
作用于泛型 T
上来获取泛型 T
上的所有 public 属性名
构成的 联合类型
注意:"public、protected、private"修饰符不可出现在类型成员上
例如:
type unionKey = keyof IUser
// unionKey 结果如下,其获得了接口类型 IUser 中的所有属性名组成的联合类型
type unionKey = "name" | "age" | "department"
in
我们需要遍历 IUser
,这时候 映射类型
就可以用上了,其语法为 [P in Keys]
keyof
的作用上述问题中 [P in keyof T]
中括号是干什么的?这里也就很清晰了。
T[P]
我们可以通过 keyof
查询索引类型的属性名,那么如何获取属性名对应的属性值类型呢?
这里就用到了 索引访问操作符
,与 JavaScript 种访问属性值的操作类似,访问类型的操作符也是通过 []
来访问的,即 T[P]
,其中”中括号“中的 P
与 [P in keyof T]
中的 P
相对应。
例如
type unionKey = keyof IUser // "name" | "age" | "department"
type values = IUser[unionKey] // string | number 属性值类型组成的联合类型
最后我们希望得到的是由多个 key, value
组成的新类型,故而在 [P in keyof T]?: T[P];
外部包上一层大括号。
到此我们解决遇到的所有问题,只需要逐步代入到 Partial
类型定义中即可。
总结:
JavaScript
的代码方式表述出来,然后使用 TypeScript
对其进行实现。Partial
的类型定义),发现问题点在哪里,然后针对性查证并解决。Partial Required Readonly Pick Record keyof keyof 是索引类型查询操作符。 假设T是一个类型,那么keyof T产生的类型是T的属性名称字符串字面量类型构成的联合类型。 特别说明: T是数据类型,并非数据本身。 代码实例如下: ValueOf 同 keyof,是值类型的查询操作符 条件类型...
一、交叉类型(Intersection Types) 交叉类型是奖多个类型合并为一个类型。这往我们可以把多个现有的多种类型叠加成为一种类型,它包含了所需的所有类型的特性。主要用于多个对象的混合。 例如, Person & Serializable & Loggable同时是Person和Serializable和Loggable。 就是说这个类型的对象同时拥有了这三种类型...
映射类型 条件类型...
交叉类型 将多个类型合并为一个类型,可以用于对象混入。使用&符号连接 交叉类型具有每一个类型的方法和属性 联合类型 联合类型可以对一个变量声明多个类型,但只能选择其中一种,使用 | 分隔各个类型 联合类型的变量只能访问两种类型共有的属性 可区分的来联合类型 一个变量如果是多个类型的联合类型,并且具有共有属性,那么就可以用共有属性创建不同的类型保护区块 字面量类型 可以把一个字面量的值作为一...
1.组合类型 把给定的多种类型合并,并得到一个带有全部属性的新类型。 2.Union 类型 用来在给定变量中使用不同类型 3.泛型 用来重用给定类型的一部分的方式,来处理参数传入的类型 T。 4.工具类型 Partial:要想使属性是可选的,必须用到 Partial 关键字,并传入 PartialType 类型作为参数。现在所有字段都变成了可选的。 Required:使所有符合条件的属性成为必需的...
一、联合类型 联合类型也可以称为多选类型,当我们希望标注一个变量为多个类型之一时可以选择联合类型标注,或 的关系 二、交叉类型 交叉类型也可以称为合并类型,可以把多种类型合并到一起成为一种新的类型,并且 的关系 对一个对象进行扩展: 三、字面量类型 有的时候,我们希望标注的不是某个类型,而是一个固定值,就可以使用字面量类型,配合联合类型会更有用 四、类型别名 有的时候类型标注比...
交叉类型 联合类型 类型保护 null和undefined 类型别名 this类型 keyof 映射类型...
& (交叉类型) &让两者的类型都满足才行,否则报错: |(联合类型 ) 即满足其中一个类型即可: Pick(提取关键字) Pick<T, U>:从T中提取U属性,返回取到的所有属性。 Record(记录 ) Record<K , T>:把T变成K的所有属性的值类型。 Omit(反向获取) Omit<T, U> :从T中剔除...
1、泛型 泛型是可以在保证类型安全前提下,让函数等与多种类型一起工作,从而实现复用,常用于:函数、接口、class 中 需求:创建一个 id 函数,传入什么数据就返回该数据本身(也就是说,参数和返回值类型相同) 比如,id(10) 调用以上函数就会直接返回 10 本身。但是,该函数只接收数值类型,无法用于其他类型 为了能让函数能够接受任意类型,可以将参数类型修改为 any。但是,这样就失去了 TS...
文章目录 TS高级类型 class类 构造函数 实例方法 实现接口 修饰符 类型兼容性 对象之间的类型兼容 接口之间的类型兼容 函数之间的类型兼容 交叉类型 泛型 基本使用 泛型约束 泛型接口 泛型类 泛型工具类型 索引签名类型 映射类型 索引查询类型 TS高级类型 class类 构造函数 实例方法 实现接口 修饰符 public(公有):默认,可以被任何地方访问 protected(受保护):仅...