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

如何实现保留嵌套结构的TypeScript DeepPartial变体类型

实现TypeScript的DeepPartialWithStructure类型(保留嵌套结构,仅叶子值可选)

要实现你需要的类型,核心是区分嵌套对象和叶子值:嵌套对象的属性必须保留且必填,而叶子值(字符串、数字、布尔值、数组、null)允许为undefined。以下是具体的类型定义和验证示例:

类型定义

type DeepPartialWithStructure<T> = 
  // 处理基本类型、null:允许为原类型或undefined
  T extends string | number | boolean | null ? T | undefined :
  // 处理数组:允许为原数组类型或undefined
  T extends Array<infer U> ? T | undefined :
  // 处理对象:强制所有属性必填,递归处理属性类型
  T extends object ? { [K in keyof T]-?: DeepPartialWithStructure<T[K]> } :
  // 兜底情况
  T | undefined;

代码验证

用你提供的Foo接口测试:

interface Foo {
  nested: { val: string }
  arr: string[]
}

type FooPartial = DeepPartialWithStructure<Foo>;

// ✅ 合法:nested必须存在,val可缺省(自动推断为undefined)
let x: FooPartial = { nested: {} };

// ✅ 合法:arr可以设为undefined
let y: FooPartial = { nested: { val: "hello" }, arr: undefined };

// ✅ 合法:val可以显式设为undefined
let z: FooPartial = { nested: { val: undefined }, arr: ["a", "b"] };

// ❌ 不合法:nested属性缺失,不符合结构要求
// let invalid: FooPartial = { arr: [] };

关键逻辑说明

  • 对于对象类型,使用{ [K in keyof T]-?: ... }中的-?强制移除属性的可选性,确保嵌套结构必须完整存在,不能省略对象属性。
  • 对于叶子值(基本类型、数组、null),直接扩展为原类型 | undefined,允许这些值为undefined或缺失(TypeScript会自动推断缺失的叶子值为undefined)。

内容的提问来源于stack exchange,提问作者Jason

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 01:05:01