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

TypeScript嵌套Record递归类型定义报错,求原因及实现方案

TypeScript递归嵌套Record类型定义问题解析

问题场景

TypeScript 3.7及以上版本支持递归类型,我尝试定义一个嵌套Record结构:字符串键对应的取值可以是数值,也可以是同类型的嵌套结构。写出如下代码后,编译器报错Type alias 'NestedRecord' circularly references itself:

type NestedRecord = Record<string, number | NestedRecord>

const test: NestedRecord = {
  a: 10,
  b: {
    c: 20,
    d: 30,
  }
}

想了解递归类型是否存在未知限制,以及如何正确实现该结构的类型定义。

问题原因与解决方案

限制说明

直接使用Record工具类型编写递归类型别名时,会触发循环引用报错。这是因为Record<K, V>是语法糖,展开后类型检查器无法正确处理这种直接的自引用循环,TS对类型别名的递归支持有特定要求——需要通过对象字面量的形式实现递归,而非借助Record这类工具类型的间接写法。

正确实现方式

可以通过泛型定义递归类型,既符合TS的递归类型规则,又能灵活适配不同的取值类型:

单行泛型方案

直接在对象字面量中定义递归结构,避免使用Record工具类型:

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

// 使用示例
const test: NestedRecord<number> = {
  a: 10,
  b: {
    c: 20,
    d: 30,
  }
}

拆分类型方案

如果需要配合递归函数操作,可将取值类型拆分为单独的别名,结构更清晰:

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

// 使用示例
const test: NestedRecord<number> = {
  a: 10,
  b: {
    c: 20,
    d: 30,
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 12:35:10