TypeScript嵌套数组推入问题:如何动态适配多维度数组?
解决TypeScript嵌套数组的类型与初始化问题
嘿,我完全懂你的困惑——你之前定义的PossiblyNested类型其实理解错了联合类型的作用!它表示的是整个数组要么是一维数字数组,要么是二维数字数组,而不是「数组里可以同时存放数字或者一维数字数组」的容器,这就是你push元素时触发类型错误的核心原因。
下面给你两种针对性的解决方案,完全不用any或unknown:
1. 正确定义「可混合嵌套元素」的数组类型(推荐)
如果你需要数组能动态接收number或任意深度(最多6维)的数字数组元素,应该把数组的元素类型定义为联合类型,或者用递归类型来支持多层嵌套:
针对最多6维的递归类型定义
// 递归类型:支持number本身,或最多6层的嵌套数字数组 type NestedNumberArray<T = number, Depth extends number[] = []> = Depth['length'] extends 6 ? T : T | Array<NestedNumberArray<T, [...Depth, 1]>>; // 你的目标数组类型:元素可以是number或任意≤6维的嵌套数字数组 type PossiblyNested = Array<NestedNumberArray>;
简洁初始化与使用
现在初始化就非常简单了,直接声明空数组即可,后续push任何符合要求的元素都不会报错:
const PROCESSED_INPUTS: PossiblyNested = []; // 完全合法的操作 PROCESSED_INPUTS.push(100); PROCESSED_INPUTS.push([200, 300]); PROCESSED_INPUTS.push([[400, 500], [600, 700]]); // 最多可以推到6维数组,都能被类型检查覆盖
2. 如果你坚持用原联合数组类型(不推荐)
如果你的实际需求是「数组要么全是一维,要么全是二维」,只是想先初始化空数组再后续填充,那可以用类型断言明确初始类型:
type PossiblyNested = Array<number> | Array<Array<number>>; // 用类型断言告诉TS空数组属于这个联合类型 const PROCESSED_INPUTS = [] as PossiblyNested; // 注意:一旦你push了某一种类型的元素,后续就只能push同类型的 PROCESSED_INPUTS.push(123); // PROCESSED_INPUTS.push([456]); // 这里会报错,因为数组已被推断为number[]类型
显然第一种方案更符合你「动态接收两种类型元素」的需求,而且递归类型还能完美适配你实际场景中最多6维的限制,完全不需要繁琐的初始化后清空操作。
内容的提问来源于stack exchange,提问作者Stewii
相关产品推荐
相关产品推荐

