Skip to content

TypeScript 中 的 Partial 和 Required #74

@inkjuncom

Description

@inkjuncom

核心作用

  • 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)、部分配置 数据补全、配置合并后的最终检查

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions