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

TypeScript中使用wagmi的useContractReads传参报错求助

解决wagmi useContractReads中args参数的TypeScript类型错误

核心方案

显式指定contracts数组的类型为wagmi内置的UseContractReadsConfig['contracts'],让TypeScript正确识别不同合约函数的参数要求。

修改后的代码

import { abi } from "../constants/CryptoDevsToken";
import { useContractReads, type UseContractReadsConfig } from "wagmi";

export function useCryptoDevsToken(address: string | undefined) {
  const configCryptoDevsToken = {
    address: "CRYPTODEVSTOKEN_GOERLI_ADDRESS",
    abi: abi,
  };
  // 显式指定contracts类型,匹配useContractReads的要求
  const contracts: UseContractReadsConfig['contracts'] = [
    {
      ...configCryptoDevsToken,
      functionName: "maxSupply",
    },
  ];
  if (address) {
    contracts.push({
      ...configCryptoDevsToken,
      functionName: "balanceOf",
      args: [address],
    });
  }
  const { data } = useContractReads({ contracts });
  return { data };
}

问题原因

初始代码中,TypeScript自动推断的contracts数组类型过于宽泛(仅识别functionName: string等通用字段),无法区分不同合约函数是否需要args参数。而wagmi的UseContractReadsConfig['contracts']类型已经和你的ABI做了关联,能精确校验每个函数的参数结构,包括args的存在性和类型。

额外优化(可选)

如果想让类型推断更精准,也可以为configCryptoDevsToken指定基于ABI的合约类型:

import { abi } from "../constants/CryptoDevsToken";
import { useContractReads, type UseContractReadsConfig } from "wagmi";

// 基于ABI生成合约类型
type CryptoDevsTokenContract = {
  address: string;
  abi: typeof abi;
};

const configCryptoDevsToken: CryptoDevsTokenContract = {
  address: "CRYPTODEVSTOKEN_GOERLI_ADDRESS",
  abi: abi,
};

这样TypeScript会更严格地校验functionName和args是否匹配ABI定义。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 23:30:50