使用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
相关产品推荐
相关产品推荐

