You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 05:16:09