如何根据Hook ID自动推导TypeScript回调参数类型
优化TypeScript钩子函数的类型推断
你可以通过将泛型与id参数的具体类型绑定,实现自动根据传入的Hook ID推断回调参数类型,无需手动指定泛型。优化后的代码如下:
enum HookID { OnOpened, OnClosed, } type HookArguments<T> = T extends HookID.OnOpened ? { arg1: string, arg2: string }: T extends HookID.OnClosed ? { arg3: boolean, arg4: boolean } : never; // 让泛型T约束为HookID,同时id的类型为T function onHook<T extends HookID>(id: T, callback: (arg: HookArguments<T>)=> void){ // 函数逻辑 } // 调用时无需手动指定泛型,TypeScript会自动根据id推断类型 onHook(HookID.OnClosed, (args)=>{ // args自动推断为{ arg3: boolean, arg4: boolean } console.log(args.arg3, args.arg4); }) onHook(HookID.OnOpened, (args)=>{ // args自动推断为{ arg1: string, arg2: string } console.log(args.arg1, args.arg2); })
原理说明
- 将泛型
T的范围约束为HookID,确保传入的id只能是枚举中的有效值 - 把
id参数的类型指定为T,TypeScript会根据传入的具体枚举值自动推断出T的类型 - 回调函数的参数类型
HookArguments<T>会随着T的推断结果自动匹配对应的参数结构,完全不需要手动声明泛型参数
这样既保留了类型安全,又简化了函数调用的写法,完全符合你想要的“直接获取ID参数的类型并注入泛型”的需求。
内容的提问来源于stack exchange,提问作者TTT
相关产品推荐
相关产品推荐

