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
相关产品推荐
相关产品推荐

