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

如何用TypeScript定义无限嵌套且值为number|number[]的对象类型?

如何定义支持无限嵌套的TypeScript对象类型?

你需要的是递归类型,这是TypeScript里实现无限嵌套结构的最优方案,不用手动定义多级Level类型,一次定义就能支持任意深度的嵌套。

原实现的问题

你之前通过TDataLevel1、TDataLevel2这种分层定义的方式,只能支持固定层数的嵌套,一旦超过预设层级就会出现类型错误。

原代码示例:

type TValue = number | number[];
type TDataLevel1 = {
  [key: string]: TValue;
};
type TDataLevel2 = {
  [key: string]: TValue | TDataLevel1;
};
type TData = {
  [key: string]: TValue | TDataLevel2;
};

错误示例(第4级嵌套报错):

let data: TData = {
  key1: 1234,
  key2: {
    key1: [2, 4],
    key2: {
      key1: [6, 8],
      key2: { key1: [10, 12, 14] },  // 此处报错
    },
  },
};

最优解决方案:递归类型

直接定义一个递归的类型,让类型自身引用自己,这样就能支持无限深度的嵌套:

type TValue = number | number[];
// 递归类型:每个属性值可以是TValue,或者另一个TData对象
type TData = {
  [key: string]: TValue | TData;
};

用这个类型改写你的示例代码,就不会再出现类型错误了:

let data: TData = {
  key1: 1234,
  key2: {
    key1: [2, 4],
    key2: {
      key1: [6, 8],
      key2: { 
        key1: [10, 12, 14],
        key3: { // 即使再加一层也完全没问题
          key1: 999
        }
      },
    },
  },
};

原理说明

递归类型的核心是让类型在定义中引用自身,TypeScript从3.7版本开始正式支持这种递归类型别名,它能自动适配任意深度的嵌套结构,完全替代手动定义多级Level类型的繁琐方式。

内容的提问来源于stack exchange,提问作者JW-redpanda

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 21:05:21