如何递归要求TypeScript对象的所有属性?嵌套属性必填实现问询
如何递归实现TypeScript的深度必填类型(DeepRequired)
当然可以实现递归版的DeepRequired,能将嵌套对象的所有可选属性(包括多层嵌套的)都转为必填。
现有实现的问题
你当前的实现已经覆盖了基础场景,但存在几个边缘case未处理:
- 函数类型会被误判为对象而递归,导致类型异常
null/undefined这类空值类型没有针对性处理- 数组、
Date、RegExp等内置对象会被不当递归,破坏原有类型结构
改进后的深度必填类型实现
以下是更健壮的版本,处理了上述边缘场景:
type DeepRequired<T> = // 直接返回函数类型,不做递归处理 T extends (...args: any[]) => any ? T : // 排除null/undefined(若需保留可改为`T extends null | undefined ? T :`) T extends null | undefined ? never : // 递归处理数组元素 T extends Array<infer U> ? Array<DeepRequired<U>> : // 对普通对象递归遍历所有属性,移除可选标记并深度处理 T extends object ? { [P in keyof T]-?: DeepRequired<T[P]> } : // 基本类型直接返回 T;
验证示例
用你提供的测试类型验证:
type Example = { a?: true, b?: { a?: true, b?: true, c?: (() => void) }, d?: (number | undefined)[] } type RequiredExample = DeepRequired<Example>
最终RequiredExample的类型为:
{ a: true; b: { a: true; b: true; c: () => void; }; d: number[]; }
自定义调整说明
- 若需要保留
null/undefined类型,可将T extends null | undefined ? never :改为T extends null | undefined ? T : - 若不需要处理数组元素,可移除数组判断的分支
内容的提问来源于stack exchange,提问作者Meow
相关产品推荐
相关产品推荐

