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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 03:40:48