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

如何在TypeScript中定义循环引用的任意嵌套JSON类型?

TypeScript递归嵌套字符串/对象类型实现方案

你需要的是一种支持无限嵌套的类型,每个键对应的值要么是string,要么是同结构的嵌套对象。之前的写法报错是因为拆分的类型循环引用问题,调整为单个递归类型即可解决:

正确类型定义

直接定义一个包含递归逻辑的类型,既可以是字符串,也可以是键为字符串、值为自身的对象:

type NestedStringRecord = string | Record<string, NestedStringRecord>;

如果要求顶层必须是对象(不能直接是字符串),可以额外定义顶层类型:

type TopLevelNestedRecord = Record<string, NestedStringRecord>;

使用示例

对应你给出的对象,使用方式如下:

// 允许顶层为字符串或对象的情况
const map1: NestedStringRecord = {
  a1: {
    b1: {
      c1: {
        d1: 'foo',
        d2: {
          e1: 'bar'
        },
        d3: 'baz'
      },
      c2: 'hello'
    },
    b2: 'world',
    b3: {
      c1: {
        d1: 'another',
        d2: 'nested',
      }
    }
  },
  a2: 'thing'
};

// 强制顶层为对象的情况
const map2: TopLevelNestedRecord = {
  a1: {
    b1: {
      c1: {
        d1: 'foo',
        ...
      }
    }
  }
};

为什么之前的写法报错

你拆分的两个类型NestedRecordStringType和RecordOrStringType形成了互相循环引用,虽然TypeScript在新版本支持类型别名循环,但这种写法冗余且没必要。单个类型内部的递归引用是TypeScript明确支持的,既能满足需求,也不会触发报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 04:32:13