TypeScript数组类型推断为unknown[]的原因及修复方案咨询
TypeScript元组类型推断问题解答
问题原因
当你在条件类型中使用[...infer A, ...infer B]这种双剩余参数的模式匹配元组时,TypeScript编译器无法确定原元组的元素该如何拆分到A和B中。因为存在多种合法拆分方式(比如A取全部元素、B为空;A为空、B取全部元素;或者各取部分元素),这种歧义导致编译器只能将A和B推断为最宽泛的unknown[]类型。
修复方法
要让编译器明确推断类型,必须给拆分逻辑增加明确约束:
1. 固定一侧为单个元素
如果只需要将元组拆分为「前缀+最后一个元素」或「第一个元素+后缀」,可以直接指定单个元素的推断位置:
// 拆分前缀和最后一个元素 type Result1 = ['A', 'B'] extends [...infer A, infer B] ? [A, B] : never; // Result1 类型为 [['A'], 'B'] // 拆分第一个元素和后缀 type Result2 = ['A', 'B'] extends [infer A, ...infer B] ? [A, B] : never; // Result2 类型为 ['A', ['B']]
2. 指定拆分长度
如果需要按固定长度拆分两个剩余部分,可以结合元组长度约束实现:
type SplitTuple<T extends any[], N extends number> = T extends [...infer A, ...infer B] ? A['length'] extends N ? [A, B] : never : never; // 按长度1拆分前缀和后缀 type Result3 = SplitTuple<['A', 'B'], 1>; // Result3 类型为 [['A'], ['B']]
联合类型推断的差异
联合类型的infer规则与元组不同:当'A' | 'B' extends infer A | infer B时,编译器会将整个联合类型捕获到每个infer变量中,不存在拆分歧义,因此A和B都会被推断为'A' | 'B',不会出现unknown的情况。
内容的提问来源于stack exchange,提问作者Carucel
相关产品推荐
相关产品推荐

