TypeScript中[1,2]匹配[...infer X,0,...infer Y]的原因及疑问
TypeScript条件类型中infer多rest元素的疑问解答
一、为什么只有带infer的多rest元素是合法的?
TypeScript在条件类型的模式匹配场景中,允许[...infer X, 0, ...infer Y]这种多rest元素的写法,这是专门为类型推断设计的特殊语法——它的目的不是定义一个普通数组类型,而是用来解构输入类型,提取出数组的前缀(X)和后缀(Y)部分。
而普通数组类型(比如[...unknown[], 0, ...unknown[]])不允许多个rest元素,是因为普通数组类型需要明确的结构定义:多个rest元素会导致类型歧义(无法界定两个rest部分各自的元素数量和位置),不符合常规数组类型的语法规则。简单说,带infer的多rest是类型推断的“工具语法”,和普通数组类型的定义规则不是一回事。
二、为什么[1,2]会匹配包含0的模式?
你看到的[1,2]匹配[...infer X, 0, ...infer Y]并得到X = unknown[]、Y = unknown[],本质是TypeScript在无法找到匹配的0元素时,会推断出最宽泛的类型来满足模式匹配:
当输入数组[1,2]中没有0时,TypeScript无法确定X和Y的具体类型(因为找不到0作为分割点),所以会将X和Y都推断为unknown[]——这是TypeScript在模式匹配失败时的一种“兜底”行为,通过最宽泛的类型让条件判断成立,而非直接返回never。
换个例子验证:如果输入数组包含0,比如A<[1,0,2]>,就会得到X = [1]、Y = [2],这才是模式匹配的预期结果。
内容的提问来源于stack exchange,提问作者vijrox
相关产品推荐
相关产品推荐

