如何使StaticArray类型支持联合长度参数生成对应元组?
解决StaticArray支持联合长度生成联合元组的问题
你当前实现的StaticArray仅能处理单一数值长度,遇到联合长度参数时会提前终止递归,只返回最小长度的元组。这是因为当L为联合类型时,递归过程中只要R['length']匹配到联合中的任意一个值(即最小长度),就会直接返回当前的R,不会继续生成更长的元组。
要实现支持联合长度生成对应联合元组的需求,核心是利用TypeScript的分配条件类型,让联合长度中的每个成员单独触发静态数组的生成逻辑,最后合并结果。
修改后的实现代码
// 内部辅助类型:负责生成单一长度的静态数组 type _StaticArray<T, L extends number, R extends any[] = []> = R['length'] extends L ? R : _StaticArray<T, L, [...R, T]>; // 对外暴露的工具类型:处理联合长度的分配逻辑 export type StaticArray<T, L extends number> = L extends L ? _StaticArray<T, L> : never;
效果验证
当传入联合长度参数时,比如StaticArray<number, 3 | 2 | 1>,TypeScript会自动对每个联合成员(3、2、1)分别执行_StaticArray逻辑,最终生成的类型为:
[number, number, number] | [number, number] | [number]
原理说明
L extends L是触发分配条件类型的关键:当L为联合类型时,这个表达式会将联合拆分为单个成员,对每个成员单独计算_StaticArray<T, L>。- 内部的
_StaticArray保持原有的递归逻辑,负责生成指定单一长度的静态数组,确保每个长度对应的元组都能正确生成。 - 所有单个长度的元组类型最终会合并为一个联合类型,满足需求。
内容的提问来源于stack exchange,提问作者Guillaume Racicot
相关产品推荐
相关产品推荐

