You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何递归要求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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 18:12:28