-
Notifications
You must be signed in to change notification settings - Fork 0
Open
Labels
Description
核心作用
Partial目标是把一个类型的所有属性变成可选的 (?)Required目标是把一个类型的所有属性变成必填的 (-?)
代码效果直观对比
假设我们有一个混合了“必填”和“可选”属性的接口:
interface User {
id: number; // 必填
name?: string; // 可选
}使用 Partial 后, 所有属性都带上了问号
type PartialUser = Partial<User>;
// 等价于:
// {
// id?: number; // 变可选了
// name?: string; // 还是可选
// }使用 Required 后, 所有属性的问号都被拿掉了
type RequiredUser = Required<User>;
// 等价于:
// {
// id: number; // 还是必填
// name: string; // 变必填了!
// }源码实现对比
这是理解它们最本质区别的地方:
- Partial: 使用 ? 来增加可选性。
// Partial: 我都要加问号
type Partial<T> = {
[P in keyof T]?: T[P];
};- Required: 使用 -? 来减去可选性。
// Required: 我都要去掉问号
type Required<T> = {
[P in keyof T]-?: T[P];
};核心对比表
| 特性 | Partial<T> |
Required<T> |
|---|---|---|
| 中文含义 | 部分的 / 局部的 | 必需的 / 必填的 |
| 核心作用 | 将所有属性变为可选 | 将所有属性变为必填 |
| 源码关键符 | ? (添加可选修饰符) |
-? (移除可选修饰符) |
| 典型场景 | 数据更新 (Patch)、部分配置 | 数据补全、配置合并后的最终检查 |