如何实现任意深度嵌套数组类型转换?以ConvertToBool<T>为例
解决任意深度嵌套数组的TypeScript类型转换问题
嘿,这问题我熟!要实现能处理任意深度嵌套数组的类型转换,关键在于用递归条件类型来逐层穿透数组结构,直到处理最内层的元素。
下面是ConvertToBool<T>的完整实现:
type ConvertToBool<T> = // 如果T是数组类型,就递归转换它的元素类型,再重新包裹成数组 T extends Array<infer U> ? Array<ConvertToBool<U>> // 非数组类型直接转成boolean : boolean;
测试一下效果:
- 三层嵌套数组场景:
ConvertToBool<number[][][]>→boolean[][][],完全符合你的需求 - 混合类型嵌套数组:
ConvertToBool<(string | number)[][]>→boolean[][] - 对象内的嵌套数组也能处理:
ConvertToBool<{ list: number[][], id: string }>→{ list: boolean[][], id: boolean }
为什么之前的实现没生效?
大概率是你只处理了第一层数组,没有递归处理嵌套的内层数组。比如如果之前的代码是这样的:
// 只处理一层数组的错误示例 type BadConvertToBool<T> = T extends Array<any> ? boolean[] : boolean;
那它只能把number[]转成boolean[],但number[][]会被直接判断为“是数组”,返回boolean[]而非boolean[][]——递归的作用就是让我们能逐层处理每一层嵌套的数组元素。
如果需要更通用的转换(比如不仅转成boolean,还能转成任意类型),还可以把目标类型抽成参数:
type ConvertTo<T, Target> = T extends Array<infer U> ? Array<ConvertTo<U, Target>> : Target; // 用法示例:ConvertTo<number[][][], boolean> → boolean[][][]
这样不管是转boolean、string还是其他自定义类型,都能复用这个通用类型啦!
内容的提问来源于stack exchange,提问作者CRice
相关产品推荐
相关产品推荐

