如何在TypeScript中定义递归类型别名表示深层嵌套结构?
解决TypeScript递归嵌套数组类型的循环引用问题
你的问题出在TypeScript对直接联合类型递归的处理限制上——虽然3.7+版本支持递归类型别名,但type NestedArray = number | NestedArray[]这种单纯的「值类型 | 自身数组」结构会被编译器判定为直接循环引用,从而抛出错误。而你提到的JSON递归类型之所以可行,是因为它包含了对象索引类型{ [key: string]: Json },这种结构的递归属于编译器允许的「结构递归」范畴。
下面提供两种可行的解决方案:
方案1:使用interface扩展数组类型
通过定义继承自Array的接口,利用接口的递归扩展特性实现嵌套数组类型:
interface NestedArray extends Array<number | NestedArray> {}
用这个类型标注你的示例数据完全符合要求:
const nestedNumbers: NestedArray = [1, [2, [3, [4]], 5]]; // 类型检查通过
方案2:使用ReadonlyArray间接实现递归
利用TypeScript内置的ReadonlyArray<T>接口,让递归通过泛型参数传递,避免直接的类型别名循环引用:
type NestedArray = number | ReadonlyArray<NestedArray>;
如果你的场景需要可变数组,可基于此进一步扩展,但这种写法更适配不需要修改的嵌套数组场景。
这两种写法都能准确表示数字或嵌套数字数组的递归结构,满足类型安全的需求。
内容的提问来源于stack exchange,提问作者Jun Yap
相关产品推荐
相关产品推荐

