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
后的所有属性都变成了必选属性,即使它们原来在原接口中是可选的。
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。