为何TypeScript无法推断我的第二个类型参数?
解决TypeScript泛型函数部分类型参数推断问题
问题原因
你遇到的错误源于TypeScript 4.7.4不支持部分显式指定泛型参数+其余自动推断的特性。当你显式传入<Erc20>作为第一个泛型参数时,TypeScript会要求你指定所有泛型参数(包括MethodName),但MethodName依赖于第一个参数C的类型,无法单独指定;同时由于你已经显式指定了C,TypeScript也不会自动从第二个函数参数method中推断MethodName。
解决方案
方案1:升级TypeScript到4.9+
TypeScript 4.9及以上版本支持部分类型参数推断,可以用_作为占位符跳过需要自动推断的泛型参数:
// TS 4.9+ 可用 useTypedRead<Erc20, _>("0xSomeAddress", "balanceOf");
方案2:柯里化函数(兼容低版本TS)
通过柯里化拆分函数参数,让TypeScript分步推断泛型类型:
// 修改函数定义 export type TypedContract = Contract & { functions: Record<string, (...args: any[]) => any>; filters: Record<string, (...args: any[]) => any>; }; export const useTypedRead = <C extends TypedContract>(address: string) => { return <MethodName extends keyof C["functions"]>( method: MethodName, params: Parameters<C["functions"][MethodName]> ): void => { // 原函数逻辑保持不变 }; }; // 调用方式 useTypedRead<Erc20>("0xSomeAddress")("balanceOf", [/* 对应balanceOf的参数 */]);
这种方式先指定C类型并传入address,返回的函数会基于C的类型自动推断MethodName,完全匹配你的需求。
方案3:显式指定所有泛型参数(可选)
如果不想调整函数结构,也可以手动指定两个泛型参数:
// 调用时显式传入MethodName useTypedRead<Erc20, "balanceOf">("0xSomeAddress", "balanceOf");
不过这种方式需要手动写出方法名,便捷性不如前两种方案。
内容的提问来源于stack exchange,提问作者Ed_
相关产品推荐
相关产品推荐

