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

TypeScript能否基于函数第一个参数推断第二个参数的类型

问题解决方法

最新版 TypeScript 完全支持根据第一个参数类型推导第二个参数类型的能力,你只需要调整SlickEventHandler的泛型定义位置,就能实现你想要的简洁写法。

你当前的SlickEventHandler接口把泛型参数定义在了接口层级,这意味着每个实例的泛型是固定的,调用subscribe时无法根据入参动态调整类型,所以才需要手动加类型断言指定泛型。

把接口的泛型参数从接口层面移到subscribe、unsubscribe方法层面即可:

// 原有工具类型保持不变
export type GetSlickEventType<T> = 
  T extends (infer U)[] ? U :
  T extends (...args: any[]) => infer U ? U :
  T extends SlickEvent<infer U> ? U : T;

type Handler<H> = (e: SlickEventData, data: GetSlickEventType<H>) => void;

// 修改SlickEventHandler定义,泛型放到方法级别
export interface SlickEventHandler {
  subscribe: <T>(slickEvent: SlickEvent<T>, handler: Handler<T>) => SlickEventHandler;
  unsubscribe: <T>(slickEvent: SlickEvent<T>, handler: Handler<T>) => SlickEventHandler;
  unsubscribeAll: () => SlickEventHandler;
}

修改完成后,你就可以直接用期望的简洁写法调用,TypeScript 会自动从第一个入参中提取事件对应的泛型类型,自动推导第二个参数 handler 里的args类型,不需要加任何额外的类型断言,也不会出现args被推断为any的问题:

this._eventHandler.subscribe(onHeaderCellRenderedHandler, (_e, args) => {
  const column = args.column; // 有正确的类型提示
  const node = args.node; // 有正确的类型提示
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 06:15:09