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

为何带?修饰符的TypeScript元组参数无法被infer推断?

TypeScript 可选元组元素的 Infer 推断问题

问题场景

尝试从包含可选元素的元组类型中提取前两个元素时,遇到了条件类型推断失败的情况:

示例1:可选元素导致推断结果为never

type OriginalParams = [a: number, b?: string | undefined, c?: { cc: 1;} | undefined]; 

type NewParams = OriginalParams extends [infer A, infer B, ...any] ? [A, B?]: never;
// NewParams 的类型结果为 never

示例2:必填元素时推断正常

将第二个元素b改为必填后,推断结果符合预期:

type OriginalParams = [a: number, b: string | undefined, c?: {
    cc: 1;} | undefined]

type NewParams = OriginalParams extends [infer A, infer B, ...any] ? [A, B?]: never;
// NewParams 正确推断为 [number, (string | undefined)]

原因解析

核心在于TypeScript对可选元组元素的匹配规则:

  • 带?修饰符的元组元素表示该元素「可以不存在」,原OriginalParams的结构允许只包含第一个元素。而条件类型[infer A, infer B, ...any]要求元组必须至少有两个元素,两者无法匹配,因此条件判断不成立,返回never。
  • 当b设为必填后,元组保证至少包含两个元素,完全满足匹配结构,所以能成功推断出A和B的类型。

解决方案

如果要兼容可选元素的提取,需要调整条件类型的匹配结构,明确第二个元素是可选的:

type OriginalParams = [a: number, b?: string | undefined, c?: { cc: 1;} | undefined]; 

type NewParams = OriginalParams extends [infer A, (infer B)?, ...any] ? [A, B?] : never;
// NewParams 正确推断为 [number, (string | undefined)?]

内容的提问来源于stack exchange,提问作者Bayn Web

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 12:14:56