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 后的所有属性都变成了必选属性,即使它们原来在原接口中是可选的。

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。