如何用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
相关产品推荐
相关产品推荐

