TypeScript工具类Partial和Required的场景分析与原理
作者:异步漫步时间:2026-10-26 06:06:34浏览:541
本文详细解析TypeScript中Partial和Required两个内置工具类的具体应用场景与底层实现原理。通过接口字段强制与可选字段的转换案例,展示如何利用Partial将接口所有属性变为可选,以及利用Required将可选属性转为必须。结合源码定义分析其类型映射机制,帮助开发者更高效地处理类型定义与对象赋值。
在实际开发中,我们常遇到这样的场景:定义了一个包含大量字段的接口(例如IPerson),且所有字段均为必填。但在具体使用时,我们往往只需要关注其中的少数几个字段,却仍希望复用该接口定义。面对这种“必须使用接口但只需部分字段”的矛盾,TypeScript提供了Partial工具类来解决。
场景描述:一个接口(IPerson)有很多个的字段,可能有几百。而且这些字段都是必须的。
我们需要使用这个接口,但是我又不可能使用它的全部。可能只会使用几个。
我还必须要使用这接口。这个时候,我们怎么解决这个问题呢?
TS给了我们一个工具类Partial,可以解决这隔办法
Partial [ pɑ rʃl ] [部分的]
使用的方式就是 let obj:Partial<接口名>={ }
以IPerson接口为例,它包含name、age、sex、address、xueli、like、height、weight等多个字段,其中sex被限制为“男”或“女”。若我们仅需声明name、age和sex,直接使用IPerson会导致类型检查报错。此时,利用Partial工具类,我们可以声明一个类型为Partial<IPerson>的对象,仅赋值所需的name、age和sex字段,从而避免类型错误。
// 这个接口有这些的字段
interface IPerson {
name: string;
age: number;
sex: "男" | "女"; //只能够是男或者女,
address: string,
xueli: string,
like: string[],
height: string,
weight:number,
// 可能这个接口还有很多字段
}
// 现在我要使用IPerson这个接口去声明name, age, sex。
// 我们就可以使用工具类 Partial。Partial表示我只使用接口中的部分声明
let zhang: Partial<IPerson> = {
name: '张三',
age: 10,
sex: '女'
}
Partial工具类的底层定义如下:type Partial<T> = { [P in keyof T]?: T[P] | undefined; }。该定义遍历接口T的所有键名P,并将每个属性的类型修改为T[P] | undefined,同时添加可选标记?。例如,对于IPerson,Partial将其转换为name?: string | undefined、age?: number | undefined等格式。这样,接口中的所有属性都变为可选,允许对象只包含部分字段而不报错。
我们将光标放在 Partial 上可以看见这样的描述
type Partial<T> = { [P in keyof T]?: T[P] | undefined; }
什么意思呢? 我们知道<T>是一个接口。
[P in keyof T] 中的T其实就是 IPerson 这个接口
简单点就是翻译成了下面这样的样子
{
name ?: string | undefined,
age ?: number | undefined
sex ?: "男" | "女" | undefined
这样的形式下去
}
通过 Partial 【怕 show儿】声明后就不会报错。达到使用接口的部分声明

此处保留原图,由程序原样展示Partial工具类的视觉说明。
interface IInfoPerson {
name: string;
age: number;
address?: string,
like?: string[],
}
我们之前声明了一个接口。其中有几个字段是可选的(address,like )。
现在我们恰好需要使用这个接口,不过有几个的可选字段要变为必须字段。
我们怎么解决这个问题呢?
1.重新声明一个接口。可以解决,但是这样不好。
2.不用管它。我们心里在使用的时候知道这几个可选的字段是必须字段
3.使用 Required 读音[rɪ ˈkwaɪ ə d ]
另一种常见场景是:接口IInfoPerson中部分字段(如address、like)为可选,但在特定业务逻辑中,这些字段必须被赋值。若重新定义接口会增加代码冗余,忽略则可能导致运行时错误。此时,可以使用Required工具类,其读音为[rɪ ˈkwaɪ ə d ],专门用于将可选字段转换为必填字段。
// 有两个可选字段
interface IInfoPerson {
name: string;
age: number;
address?: string,
like?: string[],
}
// 通过 Required 将可选字段变为必须字段
let lisi: Required<IInfoPerson> = {
name: '李四',
age: 10,
address: '在罗翔老师的视频中',
like:['吃饭','睡觉']
}
// 通过 Required 将可选字段变为必须字段 【这个会报错】
let zhang: Required<IInfoPerson> = {
name: '张三',
age: 10,
}

通过Required工具类,我们可以强制要求IInfoPerson的所有字段(包括原本可选的address和like)在赋值时必须提供。例如,声明lisi为Required<IInfoPerson>时,必须提供name、age、address和like所有字段。若尝试仅赋值name和age(如zhang对象),TypeScript编译器会报错,因为Required消除了可选标记,要求所有属性完整。
光标放在 Required 上会出现下面的提示内容
type Required<T> = { [P in keyof T]-?: T[P]; }
这里的 -? 就是抵消掉问号 ?
这就变成了
{
name: string;
age: number;
address: string,
like: string[],
}
这样就不可以缺省了Required的底层定义为:type Required<T> = { [P in keyof T]-?: T[P]; }。其中的-?符号用于移除属性原有的可选标记?,使所有属性恢复为必填状态。例如,IInfoPerson经Required处理后,转换为name: string、age: number、address: string、like: string[]的格式,确保对象赋值时不能省略任何字段。
作者最新文章
JavaScript怎么遍历对象的Symbol键和不可枚举属性
2026-11-05 13:13:39
封装一个健壮的JS字符串判空工具函数
2026-11-05 12:16:14
JavaScript合并数组的三种常用方法:concat、扩展运算符与push
2026-11-05 11:22:29
JavaScript立即执行函数(IIFE)是什么及基本语法
2026-11-05 10:51:19
JS对象数组转字符串为什么推荐用JSON.stringify()
2026-11-05 09:40:31








