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

为何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_

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 19:24:28