为何带?修饰符的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
相关产品推荐
相关产品推荐

