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

使用Wagmi遇类型错误:Object literal may only specify known properties

Wagmi usePrepareContractWrite 中address参数类型错误的解决思路

问题场景

我用TypeScript跟随Wagmi官方合约写入示例编写代码,代码如下:

export function Write() {
  const { config } = usePrepareContractWrite({
    address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',  // 错误发生在这里
    abi: [
        {
          name: 'mint',
          type: 'function',
          stateMutability: 'nonpayable',
          inputs: [],
          outputs: [],
        },
      ] as const,
    functionName: 'mint',
  });
  const { data, write } = useContractWrite(config);

  const { isLoading, isSuccess } = useWaitForTransaction({
    hash: data?.hash,
  });

  return (
    <div>
      <button disabled={!write || isLoading} onClick={() => write?.()}>
        {isLoading ? 'Minting...' : 'Mint'}
      </button>
      {isSuccess && (
        <div>
          Successfully minted your NFT!
          <div>
            <a href={`https://etherscan.io/tx/${data?.hash}`}>Etherscan</a>
          </div>
        </div>
      )}
    </div>
  );
}

在address参数处出现如下TypeScript错误:

Object literal may only specify known properties, and 'address' does not exist in type 'UsePrepareContractWriteArgs & UsePrepareContractWriteConfig'.ts(2345)

我尝试将abi定义为const断言形式(const abi = […] as const),但问题仍未解决,求解决思路。


解决思路

  • 版本不匹配是核心原因:你遇到的问题是因为使用了Wagmi v2版本,但参考的是v1的示例代码。Wagmi v2对usePrepareContractWrite的参数结构做了重构,顶层不再直接支持address、abi等属性,这些需要嵌套到contract对象中。
  • 调整参数结构:修改usePrepareContractWrite的参数,把address、abi、functionName放到contract字段内,调整后的代码片段如下:
const { config } = usePrepareContractWrite({
  contract: {
    address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',
    abi: [
      {
        name: 'mint',
        type: 'function',
        stateMutability: 'nonpayable',
        inputs: [],
        outputs: [],
      },
    ] as const,
  },
  functionName: 'mint',
});
  • 保留const断言优化类型:继续保留abi的as const断言,这样TypeScript能更精准地推导合约函数的类型,避免后续调用时的类型问题。
  • 同步useContractWrite的用法(可选):Wagmi v2中useContractWrite也支持直接传入完整配置,如果你不需要预准备的前置逻辑,也可以合并两个hook的调用,简化代码:
const { data, write, isLoading } = useContractWrite({
  contract: {
    address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',
    abi: [/* ... */] as const,
  },
  functionName: 'mint',
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 03:45:30