TypeScript 实用工具类型之 Partial 类型
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
的链接。 - 然后他们能够设置他们的
password
,firstName
和lastName
。
在这种情况下,我们之前派生的 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 指出 subscriber
与 Subscriber
类型不一致。这是因为它默认将所有字段设置为必需的。如果我们设置 password
,firstName
和 lastName
为可选,则不会报错:
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"
}
*/
现在我们可以自由的为 password
,firstName
和 lastName
赋值。
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 类型相关推荐
- TypeScript 实用工具类型之 Pick 类型
TypeScript 实用工具类型之 Pick 类型 TypeScript 实用工具类型之 Pick 类型 1. 什么是对象类型转换? 2. 什么是 TypeScript Pick? 2.1 用 Pi ...
- Typescript类,泛型,各种类型工具
一.TypeScript 类 一个类可以包含以下几个模块: 1.属性 1.1 类属性 1.2 实例属性 2.构造函数(在python中叫初始化函数) 该函数在类实例化时会被立即调用 3.方法(也是函数 ...
- typescript索引类型_TypeScript的索引类型与映射类型,以及常用工具泛型的实现
相信现在很多小伙伴都在使用 TypeScript(以下简称 TS),在 TS 中除了一些常用的基本类型外,还有一些稍微高级一点的类型,这些就是我本次文章要讲的内容:索引类型与映射类型,希望小伙伴们看过 ...
- 浅谈 TypeScript【上】-- Flow 静态类型检查工具
文章内容输出来源:拉勾教育 大前端高薪训练营 前言 在[编程语言分类]中,我介绍到JavaScript是一种类型不安全语言,没有明确的数据类型声明,变量的类型可以随意的更改.为了解决这种问题,微软开发 ...
- 【ts】typescript高阶:键值类型及type与interface区别
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 typescript高阶之键值类型及type与interface区别 前言 一.键值类型的语法 1.语法 2.错误例子 3.正确例子 ...
- typescript的类型描述_TypeScript类型声明书写详解
本文总结一下TypeScript类型声明的书写,很多时候写TypeScript不是问题,写类型就特别纠结,我总结下,我在使用TypeScript中遇到的问题.如果你遇到类型声明不会写的时候,多看看lo ...
- 解决Python自带的json序列化工具不能序列化datetime类型数据问题
解决Python自带的json序列化工具不能序列化datetime类型数据问题 参考文章: (1)解决Python自带的json序列化工具不能序列化datetime类型数据问题 (2)https:// ...
- Typescript 下 Mongoose 外键类型外键数组类型定义类型保护联合类型理解
最近给项目上Typescript,记录在迁移的过程中遇到的一个问题. 问题背景 下面这段代码 定义了一个User 接口, Company接口, Order接口以及相应的mongoose model. ...
- TypeScript学习(七):类型断言
前面我们提到了值类型,在我们设置值类型的时候,有一种定义方式就是联合类型的设定,如下: let a: number | string; a = 1; // 类型推论:此时变量a为number类型 a ...
最新文章
- 初识JavaScript(二)
- 面试题—Redis篇
- interrupt()会中断线程的wait等待
- Eclipse中使用Checkstyle,checkstyle插件检查java代码的自定义配置文件:
- 同时运行多个logstash而kibana监控界面只统计到一个的问题
- wire 和 reg_Wire和Launchkit开源,水流监控系统以及更多新闻
- 图解HTTP知识框架
- python import os.path_Python常用模块os.path——文件及路径操作
- 机房服务器维护管理规范,机房维护管理规范.pdf
- 异速联应用交付解决方案的优势
- Java调用soap协议的webservice
- 临床试验数据管理系统
- 上班第一天(3)--一个程序员的成长史(12)
- 一款表达谱数据分析的神器--CCLE--转载
- 实验吧 Guess Next Session
- 计算机网络(16)数据链路层:数据链路层的功能
- springboot skywalking douyin
- SQL语句---创建表
- 能自动翻译的软件-最精准的翻译软件
- 【推荐】智慧油田数字化油井智能入侵监测井口控制系统解决方案合集(共83份,884M)