如何用TypeScript定义各层元素长度一致的多维矩阵嵌套数组
定义每层元素长度一致的TypeScript多维矩阵类型
要实现每层所有子数组长度严格一致的多维矩阵类型,我们可以基于你提供的FixedArray固定长度数组类型,通过递归泛型来约束每一层的维度:
// 固定长度数组类型,强制数组长度等于指定的D type FixedArray<T, D extends number> = T[] & { length: D }; // 多维矩阵类型,Dims元组依次指定每一层的数组长度 type Matrix<T, Dims extends number[]> = // 递归终止条件:维度元组为空时,返回元素本身类型 Dims extends [] ? T // 拆解维度元组,当前层长度为First,剩余维度为Rest : Dims extends [infer First extends number, ...infer Rest extends number[]] ? FixedArray<Matrix<T, Rest>, First> : never;
用法示例
一维数组(长度为5的数字数组)
type OneD = Matrix<number, [5]>; const arr1d: OneD = [1, 2, 3, 4, 5]; // 合法 // const badArr1d: OneD = [1,2,3]; // 报错:长度不匹配二维矩阵(3行4列)
type TwoD = Matrix<number, [3, 4]>; const matrix2d: TwoD = [ [1,2,3,4], [5,6,7,8], [9,10,11,12] ]; // 合法 // const badMatrix2d: TwoD = [[1,2], [3,4], [5,6]]; // 报错:子数组长度不匹配三维矩阵(2×3×4)
type ThreeD = Matrix<number, [2, 3, 4]>; const matrix3d: ThreeD = [ [[1,2,3,4], [5,6,7,8], [9,10,11,12]], [[13,14,15,16], [17,18,19,20], [21,22,23,24]] ]; // 合法
原理说明
FixedArray通过交叉类型将普通数组与带有固定length属性的对象合并,让TypeScript强制校验数组长度是否符合指定值。Matrix类型采用递归逻辑:每次从维度元组Dims中取出第一个长度值,用FixedArray约束当前层的数组长度,同时递归处理剩余的维度,确保每一层的所有子数组都遵循相同的长度规则。- 注意:
Dims必须是数字字面量组成的元组(比如[3,4]),不能是number[]类型,否则TypeScript无法推断具体的长度约束。
内容的提问来源于stack exchange,提问作者NovaAstra
相关产品推荐
相关产品推荐

