TypeScript高级类型-Partial

TypeScript高级类型-PartialTypeScript高级类型-Partial预备知识:TypeScript类型系统接口泛型先来看一下Partial类型的定义/***MakeallpropertiesinToptional*/typePartial<T>={[PinkeyofT]?:T[P];};假设我们有一个定义user的接口,如下int…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

TypeScript高级类型-Partial

预备知识:

TypeScript类型系统
接口
泛型

先来看一下 Partial 类型的定义

/**
 * Make all properties in T optional
 */
type Partial<T> = {
    [P in keyof T]?: T[P];
};

Jetbrains全家桶1年46,售后保障稳定

假设我们有一个定义 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 的类型定义),发现问题点在哪里,然后针对性查证并解决。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/219080.html原文链接:https://javaforall.net

(0)
上一篇 2025年7月10日 上午11:43
下一篇 2025年7月10日 下午12:15


相关推荐

  • SIP服务器介绍

    SIP服务器介绍摘要介绍了 SIP 服务器设备的主要内容 包括 SIP 服务器在网络中的具体位置 SIP 服务器的功能要求 业务要求 协议要求 操作维护与网管 性能和可靠性要求以及电源和环境等通用的技术要求 cs Phontol comprog Phontol com nbsp nbsp nbsp 关键词 SIP 服务器 SIP 网络用户代理 prog Phontol com nbsp nbsp nbsp 1 引言 prog Phontol com nbsp nbsp nbsp 随着近年来 SI

    2026年2月22日
    1
  • fsync

    fsync转载:https://www.jb51.net/article/101062.htm脏页:linux内核中的概念,因为硬盘的读写速度远赶不上内存的速度,系统就把读写比较频繁的数据事先放到内存中,以提高读写速度,这就叫高速缓存,linux是以页作为高速缓存的单位,当进程修改了高速缓存里的数据时,该页就被内核标记为脏页,内核将会在合适的时间把脏页的数据写到磁盘中去,以保持高速缓存中的数据和磁盘中的数…

    2022年5月31日
    74
  • pycharm能不能编写Java_使用Pycharm编写第一个Python程序

    pycharm能不能编写Java_使用Pycharm编写第一个Python程序使用 Pycharm 编写第一个 1 打开 Pycharm 选择 CreateNewPro 创建一个新项目 2 选择 Location 表示该项目保存的路径 Interpreter 表示使用的 Python 解释器版本 最后点击 Create 创建项目 1 右击项目 选择 New 再选择 PythonFile2 在弹出的对话框中输入的文件名 HelloPython 点击 OK 表示创建一个 Python 程序的文

    2026年3月27日
    2
  • Python Qt GUI设计:5种事件处理机制(提升篇—3)

    Python Qt GUI设计:5种事件处理机制(提升篇—3)事件处理机制本身很复杂,是PyQt底层的知识点,当采用信号与槽机制处理不了时,才会考虑使用事件处理机制。

    2022年5月16日
    48
  • 2026 避坑指南:GPT-5.4 Codex、OpenClaw 与订阅版本全解析

    2026 避坑指南:GPT-5.4 Codex、OpenClaw 与订阅版本全解析

    2026年3月14日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号