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

TypeScript实现无限深度Deep nested types泛型类型的方法

任意深度嵌套对象泛型实现方案

你手动枚举固定层级的写法扩展性很差,要支持无限深度嵌套,直接用递归类型定义即可,TypeScript 3.7+ 版本已稳定支持递归类型别名,不需要手动枚举每一层结构。

核心类型定义

type DeepNested<T> = T | { [key: string]: DeepNested<T> }

这个类型的逻辑完全覆盖你手动枚举的所有场景:

  • 第一个分支T直接匹配最基础的目标类型值,对应你写的第一层非嵌套情况
  • 第二个分支是递归定义的对象结构:对象的键为string类型,值可以是T,也可以是继续嵌套的DeepNested<T>结构,自动支持1层、2层到任意N层的嵌套场景

用法示例

基础类型校验测试

// 所有层级的嵌套值都能通过类型校验
const val1: DeepNested<string> = "直接的原始值";
const val2: DeepNested<string> = { key: "一层嵌套值" };
const val3: DeepNested<string> = { a: { b: "二层嵌套值" } };
const val4: DeepNested<string> = { a: { b: { c: { d: { e: "任意多层嵌套都支持" } } } } };

类属性定义示例

type ConfigValue = string | number | boolean;

class AppConfig {
  // 定义支持任意深度嵌套的配置属性
  public config: DeepNested<ConfigValue>;

  constructor(initConfig: DeepNested<ConfigValue>) {
    this.config = initConfig;
  }
}

// 实例化时传入任意深度的配置对象都符合类型要求
const appConfig = new AppConfig({
  appName: "my-app",
  port: 3000,
  db: {
    host: "127.0.0.1",
    port: 5432,
    pool: {
      max: 10,
      min: 2,
      timeout: {
        connect: 5000,
        idle: 10000
      }
    }
  }
});

可选优化

如果需要排除数组、函数等特殊引用类型,仅匹配普通键值对对象,可以给类型加一层对象类型约束:

type DeepNested<T> = T | Record<string, DeepNested<T>> & object;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 04:30:54