Partial<T> Partial(含 Required)

最后更新:2026-10-22

Partial<T> Partial(含 Required)

Partial<T> 把 T 的所有属性变为可选:典型场景是"部分更新"(表单草稿、patch 接口),不必为"只改两个字段"再手写一个新类型。它与 Required<T> 互为镜像。

分组工具类型
类型类型
严格模式不需要

ℹ️ 说明 编辑器将 TypeScript 转译为 JavaScript 后运行(不做类型检查);类型检查结果见示例 Output。

📝 语法

type Partial<T> = {
  [K in keyof T]?: T[K];
};

// 用法
function applyPatch(user: UserProfile, patch: Partial<UserProfile>): UserProfile;

⚙️ 参数

T被变换的对象类型;每个属性 K 及其类型 T[K] 由映射类型逐一遍历

返回值:一个新类型:属性集合与 T 相同,但全部带 ? 可选标记。

▶ 示例

修改下面的代码,点击试一试查看转译运行结果:

输出:

{"id":1,"name":"Diana","email":"d@example.com","age":22}

(转译后运行输出;patch 只传 age,其余字段保持原值)

💡 要点

ℹ️ 说明 实现原理是映射类型:[K in keyof T]?: T[K]——遍历 T 的每个键并加 ? 标记(教程第 19 课"工具类型的实现原理"有完整推导)。
⚠️ 注意 Partial 只作用于第一层:嵌套对象属性的类型不会递归变可选;需要"深可选"要自写 DeepPartial(递归映射类型)。
💡 提示 Partial 与 Required 互为镜像(? 加与去);与 Pick/Omit 组合可以实现"只允许改某几个字段"的精确 patch 类型。
更多案例即将上线。

📚 相关教程

❓ 常见问题

Q Partial 和手写一堆 ? 有什么区别?
A 效果一样,但 Partial 跟随源类型自动更新:UserProfile 加字段后,Partial<UserProfile> 自动带上新字段的可选版本,手写版本会漏。
Q 嵌套属性也会变可选吗?
A 不会。Partial 是浅层变换,只有第一层属性带 ?;address: {city: string} 整体变可选,但 address 里的 city 仍必填。深层需求自写 DeepPartial。
Q Partial 之后给必填字段赋 undefined 可以吗?
A 可以赋值省略字段,但显式赋 undefined 是否合法取决于 strictNullChecks:严格模式下 Partial 的属性类型是 T[K] | undefined,非严格模式两者都宽松。建议始终开严格模式。
Web-Tutorial.com

Web-Tutorial 技术团队

由多位开发者共同维护的编程教程平台。每篇教程由对应领域的开发者编写和审核,确保内容准确可靠。如发现任何问题,欢迎向我们反馈。

100%

🙏 帮我们做得更好

我们是刚上线的编程教程站,几个人的小团队,精力有限。页面虽经检查,难免还有疏漏——链接失效、排版错乱、内容有误、语言生硬……

如果您发现了,麻烦告诉我们,我们会在收到反馈后第一时间进行修复,再次感谢您的光临 🙏