TypeScript 实用工具类型之 Partial 类型

  • TypeScript 实用工具类型之 Partial 类型
    • 1. 场景概述
    • 2. Partial<Type>
    • 3. 使用 Interface
    • 4. 小结

TypeScript 实用工具类型之 Partial 类型

在本文中,我们将使用 Partial<> 来讨论 TypeScript 中的对象类型转换。这是 TypeScript 实用工具类型系列的第三部分。

在上一篇文章(TypeScript 实用工具类型之 Omit 类型),我们介绍了一个示例,在该示例中,我们通过省略基本类型 SuperbUser 的一个属性(使用Omit<>)来派生 Subscriber 类型。

在这篇文章中,我们将考虑一个 TypeScript Partial<> 的例子,通过修改我们的 Subscriber 类型来假设一个更现实的场景。

1. 场景概述

对于我们的博客,我们会有不允许点赞或评论文章的 GuestUser。我们将允许 Subscriber 点赞和评论。所以,情况是这样的:

  • GuestUser 必须用他们的 email 注册并成为 Subscriber
  • 他们会在发送到自己邮箱的 email 中收到设置 password 的链接。
  • 然后他们能够设置他们的 passwordfirstNamelastName

在这种情况下,我们之前派生的 Subscriber 类型不能以我们想要的方式交付我们的需求:

type Subscriber = {userId: number,macAddress: string,username: string,email: string,password: string,firstName: string,lastName: string,
};const subscriber: Subscriber = {userId: 4,macAddress: '1.2.3',username: 'xiaan',email: 'xiaan@163.com'
};console.log(subscriber);
/*
From TypeScript Error:
"Type '{ userId: number; macAddress: string; username: string; email: string; }' is missing the following properties from type 'Subscriber': password, firstName, lastName"From console:
{"userId": 4,"macAddress": "1.2.3","username": "xiaan","email": "xiaan@163.com"
}
*/

TypeScript 指出 subscriberSubscriber 类型不一致。这是因为它默认将所有字段设置为必需的。如果我们设置 passwordfirstNamelastName 为可选,则不会报错:

type Subscriber = {userId: number,macAddress: string,username: string,email: string,password?: string,firstName?: string,lastName?: string,
};const subscriber: Subscriber = {userId: 4,macAddress: '1.2.3',username: 'xiaan',email: 'xiaan@163.com'
};console.log(subscriber);
/*
{"userId": 4,"macAddress": "1.2.3","username": "xiaan","email": "xiaan@163.com"
}
*/

但是这需要首先手动定义 Subscriber,然后再设置各个可选属性。在实际的 API 中,手动定义形状并不是一个好主意。

2. Partial

我们希望消除这种麻烦,并更轻松地从 Omit<> 返回的类型中完成此工作。所以我们要做的是用 Partial<type> 将返回类型的所有属性设置为可选的:

type SuperbUser = {userId: number,macAddress: string,username: string,email: string,password: string,firstName: string,lastName: string,roles: ('Admin' | 'Editor' | 'Author')[]
};type Subscriber = Partial<Omit<SuperbUser, 'roles'>>;const subscriber: Subscriber = {userId: 4,macAddress: '1.2.3',username: 'xiaan',email: 'xiaan@163.com'
};console.log(subscriber);
/*
{"userId": 4,"macAddress": "1.2.3","username": "xiaan","email": "xiaan@163.com"
}
*/

现在我们可以自由的为 passwordfirstNamelastName赋值。

subscriber.password = '12345678';
subscriber.firstName = 'an';
subscriber.lastName = 'xia';console.log(subscriber);
/*
{"userId": 4,"macAddress": "1.2.3","username": "xiaan","email": "xiaan@163.com","password": "12345678","firstName": "an","lastName": "xia"
}
*/

但是,就像之前一样,如果我们添加了不属于 Subscriber 的属性,TypeScript 会再次报错:

subscriber.roles = ['Reader', 'Commenter'];console.log(subscriber);
// Property 'roles' does not exist on type 'Partial<Omit<SuperbUser, "roles">>'.

因此,使用 TypeScript 派生 partial 类型的好处包括它对对象属性的部分赋值的支持,这是 JavaScript 允许的,而默认 TypeScript 不允许。

3. 使用 Interface

如果我们使用基本 SuperbUser 类型的接口,我们会得到相同的结果:

interface SuperbUser {userId: number;macAddress: string;username: string;email: string;password: string;firstName: string;lastName: string;roles: ('Admin' | 'Editor' | 'Author')[]
};type Subscriber = Partial<Omit<SuperbUser, 'roles'>>;const subscriber: Subscriber = {userId: 4,macAddress: '1.2.3',username: 'xiaan',email: 'xiaan@163.com'
};subscriber.password = '12345678';
subscriber.firstName = 'an';
subscriber.lastName = 'xia';console.log(subscriber);
/*
{"userId": 4,"macAddress": "1.2.3","username": "xiaan","email": "xiaan@163.com","password": "12345678","firstName": "an","lastName": "xia"
}
*/

我们还可以将 Omit<> 的返回类型重构为中介类型 StrictSubscriber,并将其作为 TypeScript Partial 的参数传递:

type StrictSubscriber = Omit<SuperbUser, 'roles'>;
type Subscriber = Partial<StrictSubscriber>;

4. 小结

在这篇文章中,我们介绍了使用实用转换器 partial 的使用,不过手动将类型的某些属性设置为可选更可取,特别是在处理从 API 返回的类型时。

TypeScript 实用工具类型之 Partial 类型相关推荐

  1. TypeScript 实用工具类型之 Pick 类型

    TypeScript 实用工具类型之 Pick 类型 TypeScript 实用工具类型之 Pick 类型 1. 什么是对象类型转换? 2. 什么是 TypeScript Pick? 2.1 用 Pi ...

  2. Typescript类,泛型,各种类型工具

    一.TypeScript 类 一个类可以包含以下几个模块: 1.属性 1.1 类属性 1.2 实例属性 2.构造函数(在python中叫初始化函数) 该函数在类实例化时会被立即调用 3.方法(也是函数 ...

  3. typescript索引类型_TypeScript的索引类型与映射类型,以及常用工具泛型的实现

    相信现在很多小伙伴都在使用 TypeScript(以下简称 TS),在 TS 中除了一些常用的基本类型外,还有一些稍微高级一点的类型,这些就是我本次文章要讲的内容:索引类型与映射类型,希望小伙伴们看过 ...

  4. 浅谈 TypeScript【上】-- Flow 静态类型检查工具

    文章内容输出来源:拉勾教育 大前端高薪训练营 前言 在[编程语言分类]中,我介绍到JavaScript是一种类型不安全语言,没有明确的数据类型声明,变量的类型可以随意的更改.为了解决这种问题,微软开发 ...

  5. 【ts】typescript高阶:键值类型及type与interface区别

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 typescript高阶之键值类型及type与interface区别 前言 一.键值类型的语法 1.语法 2.错误例子 3.正确例子 ...

  6. typescript的类型描述_TypeScript类型声明书写详解

    本文总结一下TypeScript类型声明的书写,很多时候写TypeScript不是问题,写类型就特别纠结,我总结下,我在使用TypeScript中遇到的问题.如果你遇到类型声明不会写的时候,多看看lo ...

  7. 解决Python自带的json序列化工具不能序列化datetime类型数据问题

    解决Python自带的json序列化工具不能序列化datetime类型数据问题 参考文章: (1)解决Python自带的json序列化工具不能序列化datetime类型数据问题 (2)https:// ...

  8. Typescript 下 Mongoose 外键类型外键数组类型定义类型保护联合类型理解

    最近给项目上Typescript,记录在迁移的过程中遇到的一个问题. 问题背景 下面这段代码 定义了一个User 接口, Company接口, Order接口以及相应的mongoose model. ...

  9. TypeScript学习(七):类型断言

    前面我们提到了值类型,在我们设置值类型的时候,有一种定义方式就是联合类型的设定,如下: let a: number | string; a = 1; // 类型推论:此时变量a为number类型 a ...

最新文章

  1. 初识JavaScript(二)
  2. 面试题—Redis篇
  3. interrupt()会中断线程的wait等待
  4. Eclipse中使用Checkstyle,checkstyle插件检查java代码的自定义配置文件:
  5. 同时运行多个logstash而kibana监控界面只统计到一个的问题
  6. wire 和 reg_Wire和Launchkit开源,水流监控系统以及更多新闻
  7. 图解HTTP知识框架
  8. python import os.path_Python常用模块os.path——文件及路径操作
  9. 机房服务器维护管理规范,机房维护管理规范.pdf
  10. 异速联应用交付解决方案的优势
  11. Java调用soap协议的webservice
  12. 临床试验数据管理系统
  13. 上班第一天(3)--一个程序员的成长史(12)
  14. 一款表达谱数据分析的神器--CCLE--转载
  15. 实验吧 Guess Next Session
  16. 计算机网络(16)数据链路层:数据链路层的功能
  17. springboot skywalking douyin
  18. SQL语句---创建表
  19. 能自动翻译的软件-最精准的翻译软件
  20. 【推荐】智慧油田数字化油井智能入侵监测井口控制系统解决方案合集(共83份,884M)

热门文章

  1. vscode启动运行 rg.exe占满cpu,电脑很卡处理【自留记录】
  2. 深圳普通中学老师工资单曝光,没想到在程序员社区引起热议~
  3. 论 C++ 在OpenJudge中做题的易错点(一)
  4. 四川省公安厅交通警察总队异地容灾系统建设采购
  5. 大咖说*计算讲谈社|AI 的价值探索:如何拓展商业边界?
  6. 【手把手带你刷题】-C语言编程入门篇(一)
  7. struts2 action的安全隐患 上
  8. AJAX的完整介绍-江阳宏海
  9. 文档查看器(Evince)打开中文PDF显示乱码的问题
  10. evincenbsp;显示中文乱码