直接用 Partial 即可将类型 T 的所有顶层属性变为可选,其本质是映射类型 { [P in keyof T]?: T[P] },仅影响顶层、不递归、值类型不变,常用于表单更新、构造函数参数和配置合并。

直接用 PartialT 的所有属性自动加上 ?,变成可选。
核心原理:映射类型 + keyof
Partial 的定义本质上是一行映射类型:
type Partial拆解来看:
-
keyof T:取出T所有属性名,组成联合字面量类型(比如"name" | "age" | "email") -
P in keyof T:遍历每个属性名P -
?::为每个属性添加可选修饰符 -
T[P]:保留原属性的值类型,不作改动
实际用法示例
假设你有这样一个接口:
interface User {id: number;
name: string;
email: string;
}
想让它支持“只填部分字段”,就套一层 Partial:
const updateData: Partialconst fullUser: Partial
注意几个关键点
- 只作用于**顶层属性**:如果某个属性本身是对象(如
address: { city: string }),Partial不会递归处理它的内部属性 - 值类型不变:
name?: string表示该属性可缺省,但一旦提供,值必须是string;它不会自动变成string | undefined—— 实际上在 TypeScript 中,可选属性默认就隐含| undefined(除非启用了--exactOptionalPropertyTypes) - 不是运行时操作:Pure 编译期类型转换,零性能开销
常见搭配场景
- 表单更新:后端只接收部分字段,用
Partial做请求体类型 - 构造函数参数:允许传入任意子集,提升调用灵活性
- 合并配置:用
Object.assign({}, defaults, overrides)时,overrides类型适合用Partial











