export type Primitive = undefined | null | boolean | string | number | symbol;
export type DeepRequired<T> = T extends Primitive ? T : keyof T extends never ? T : { [K in keyof T]-?: DeepRequired<T[K]> };

在 TypeScript 中,DeepRequired<T> 是一个深度可选属性转为必选属性的类型。其作用是对传入的泛型 T 进行处理,如果 T 是原始类型(Primitive),则直接返回 T 本身;如果 T 不是原始类型,并且它没有索引签名(即 keyof T extends never),也直接返回 T;否则,对 T 的每个属性进行递归操作,将所有层级的可选属性转换为必选属性。

export type Primitive = undefined | null | boolean | string | number | symbol;

// DeepRequired 类型定义
export type DeepRequired<T> = 
  // 如果 T 是原始类型,则保持不变
  T extends Primitive ? T : 
  // 如果 T 没有索引签名(非对象或数组类型),也保持不变
  keyof T extends never ? T : 
  // 否则,对于 T 中的每个属性 K,将其变为必选属性,并递归应用 DeepRequired 到属性值上
  { [K in keyof T]-?: DeepRequired<T[K]> };

例如,对于以下接口:

interface User {
  name?: string;
  age?: number;
  address?: {
    street?: string;
    city?: string;
  };
}

使用 DeepRequired<User> 将会得到:

{
  name: string;
  age: number;
  address: {
    street: string;
    city: string;
  };
}

这意味着使用了 DeepRequired 后的所有属性都变成了必选属性,即使它们原来在原接口中是可选的。