代码先锋网 代码片段及技术文章聚合

TypeScript高级类型-Partial

技术标签: Typescript  TypeScript面向类型编程  typescript  高级类型  面向类型编程  Partial

TypeScript高级类型-Partial

预备知识:

TypeScript类型系统
接口
泛型

先来看一下 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> 是如何实现类型转化的呢?

  1. 遍历入参 T ,获得每一对 key, value

  2. 将每一对中的 key 变为可选,即添加 ?

  3. 希望得到的是由 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]

  • P:类型变量,依次绑定到每个属性上,对应每个属性名的类型
  • 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 类型定义中即可。


总结:

  1. 针对高级类型的编写,我们可以尝试将其以 JavaScript 的代码方式表述出来,然后使用 TypeScript 对其进行实现。
  2. 在每一个小步骤中遇到不懂的,可以结合最后的结果进行比对(比如本文中 Partial 的类型定义),发现问题点在哪里,然后针对性查证并解决。
版权声明:本文为roamingcode原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/roamingcode/article/details/104111165

智能推荐

typescript——高级类型

Partial Required Readonly Pick Record keyof keyof 是索引类型查询操作符。 假设T是一个类型,那么keyof T产生的类型是T的属性名称字符串字面量类型构成的联合类型。 特别说明: T是数据类型,并非数据本身。 代码实例如下: ValueOf 同 keyof,是值类型的查询操作符 条件类型...

TypeScript 高级类型整理

一、交叉类型(Intersection Types) 交叉类型是奖多个类型合并为一个类型。这往我们可以把多个现有的多种类型叠加成为一种类型,它包含了所需的所有类型的特性。主要用于多个对象的混合。 例如, Person & Serializable & Loggable同时是Person和Serializable和Loggable。 就是说这个类型的对象同时拥有了这三种类型...

typeScript笔记 --- 高级类型

映射类型 条件类型...

TypeScript的高级类型

交叉类型 将多个类型合并为一个类型,可以用于对象混入。使用&符号连接 交叉类型具有每一个类型的方法和属性 联合类型 联合类型可以对一个变量声明多个类型,但只能选择其中一种,使用 | 分隔各个类型 联合类型的变量只能访问两种类型共有的属性 可区分的来联合类型 一个变量如果是多个类型的联合类型,并且具有共有属性,那么就可以用共有属性创建不同的类型保护区块 字面量类型 可以把一个字面量的值作为一...

TypeScript高级类型

1.组合类型 把给定的多种类型合并,并得到一个带有全部属性的新类型。 2.Union 类型 用来在给定变量中使用不同类型 3.泛型 用来重用给定类型的一部分的方式,来处理参数传入的类型 T。 4.工具类型 Partial:要想使属性是可选的,必须用到 Partial 关键字,并传入 PartialType 类型作为参数。现在所有字段都变成了可选的。 Required:使所有符合条件的属性成为必需的...

猜你喜欢

TypeScript高级类型

一、联合类型 联合类型也可以称为多选类型,当我们希望标注一个变量为多个类型之一时可以选择联合类型标注,或 的关系 二、交叉类型 交叉类型也可以称为合并类型,可以把多种类型合并到一起成为一种新的类型,并且 的关系 对一个对象进行扩展: 三、字面量类型 有的时候,我们希望标注的不是某个类型,而是一个固定值,就可以使用字面量类型,配合联合类型会更有用 四、类型别名 有的时候类型标注比...

typescript高级类型笔记

交叉类型 联合类型 类型保护 null和undefined 类型别名 this类型 keyof 映射类型...

typescript高级类型语法

& (交叉类型) &让两者的类型都满足才行,否则报错: |(联合类型 ) 即满足其中一个类型即可: Pick(提取关键字) Pick<T, U>:从T中提取U属性,返回取到的所有属性。 Record(记录 ) Record<K , T>:把T变成K的所有属性的值类型。 Omit(反向获取)  Omit<T, U> :从T中剔除...

【TypeScript】高级类型

1、泛型 泛型是可以在保证类型安全前提下,让函数等与多种类型一起工作,从而实现复用,常用于:函数、接口、class 中 需求:创建一个 id 函数,传入什么数据就返回该数据本身(也就是说,参数和返回值类型相同) 比如,id(10) 调用以上函数就会直接返回 10 本身。但是,该函数只接收数值类型,无法用于其他类型 为了能让函数能够接受任意类型,可以将参数类型修改为 any。但是,这样就失去了 TS...

TypeScript高级类型(二)

文章目录 TS高级类型 class类 构造函数 实例方法 实现接口 修饰符 类型兼容性 对象之间的类型兼容 接口之间的类型兼容 函数之间的类型兼容 交叉类型 泛型 基本使用 泛型约束 泛型接口 泛型类 泛型工具类型 索引签名类型 映射类型 索引查询类型 TS高级类型 class类 构造函数 实例方法 实现接口 修饰符 public(公有):默认,可以被任何地方访问 protected(受保护):仅...