TypeScript泛型动态函数参数:Type类型自动推断来源问询
TypeScript泛型参数推断问题解析
问题背景
刚接触TypeScript,遇到如下类型定义:当传入"LOGIN"作为第一个参数时,还需传入对应的payload。
type EVENTS = | { type: "LOGIN"; payload: { userId: number; }; } | { type: "SIGNOUT" }; let myfunc = <Type extends EVENTS["type"]>( ...param: Extract<EVENTS, { type: Type }> extends { payload: infer TPayload } ? [Type, TPayload] : [Type] ) => {};
使用示例:myfunc("SIGNOUT")
疑问
调用函数时若不手动通过<>指定Type,该类型是从哪里推断而来的?
我的理解:TypeScript此时无法立即计算?左侧的表达式,但它识别到函数参数要么是[Type, Payload]要么是[Type],第一种参数始终是Type,因此调用时会将第一个参数解析为Type。请问我的理解是否正确?
解答
你的理解方向没错,但可以拆解得更清楚:
- TypeScript的泛型参数推断是从实际传入的函数参数反向推导泛型类型的。这里的关键是,不管条件类型走哪个分支,
param的第一个元素类型都是Type。 - 当你调用
myfunc("SIGNOUT")时,TypeScript会先抓取第一个参数的字面量类型"SIGNOUT",把它和泛型约束EVENTS["type"](也就是"LOGIN" | "SIGNOUT")匹配,直接把Type确定为"SIGNOUT"。 - 确定
Type之后,TypeScript再代入条件类型计算,得出param的类型应该是["SIGNOUT"],以此验证你的调用符合要求。
说白了,不是TypeScript“没法立刻算条件表达式”,而是它先走了「从参数推泛型」的流程,拿到Type后再去计算条件类型,最终确定完整的参数规则。
内容的提问来源于stack exchange,提问作者user20317007
相关产品推荐
相关产品推荐

