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

调用setUsdtBalance(balance)时出现TypeScript类型错误求助

解决React + Web3获取USDT余额的TypeScript类型不匹配问题

问题原因

TypeScript无法自动推断Web3合约调用balanceOf的返回类型,导致balance被识别为void | [] | (unknown[] & []),与setUsdtBalance期望的string | null类型不兼容。

解决方案

方案1:类型断言(快速解决)

直接给合约调用的结果添加类型断言,明确其为字符串类型:

const handleGetBalance = async () => {
  if (!address) return;

  const contractABI = [
    {
      "constant": true,
      "inputs": [{ "name": "_owner", "type": "address" }],
      "name": "balanceOf",
      "outputs": [{ "name": "balance", "type": "uint256" }],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    }
  ];

  const contractAddress = '0xdAC17F958D2ee523a2206206994597C13D831ec7';
  const usdtContract = new web3.eth.Contract(contractABI, contractAddress);
  // 添加类型断言,指定返回值为string
  const balance = await usdtContract.methods.balanceOf(address).call() as string;
  setUsdtBalance(balance);
};

方案2:利用const断言让TypeScript自动推断ABI类型(更严谨)

通过as const标记ABI,让TypeScript解析出合约方法的具体返回类型,无需手动断言:

const handleGetBalance = async () => {
  if (!address) return;

  // 用as const锁定ABI的类型结构,让TypeScript能推断方法返回值
  const contractABI = [
    {
      "constant": true,
      "inputs": [{ "name": "_owner", "type": "address" }],
      "name": "balanceOf",
      "outputs": [{ "name": "balance", "type": "uint256" }],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    }
  ] as const;

  const contractAddress = '0xdAC17F958D2ee523a2206206994597C13D831ec7';
  const usdtContract = new web3.eth.Contract(contractABI, contractAddress);
  // 此时TypeScript会自动推断balance为string类型
  const balance = await usdtContract.methods.balanceOf(address).call();
  setUsdtBalance(balance);
};

额外优化:添加错误处理

合约调用可能因网络问题或无效地址抛出异常,建议添加try/catch避免程序崩溃:

const handleGetBalance = async () => {
  if (!address) return;

  const contractABI = [
    {
      "constant": true,
      "inputs": [{ "name": "_owner", "type": "address" }],
      "name": "balanceOf",
      "outputs": [{ "name": "balance", "type": "uint256" }],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    }
  ] as const;

  const contractAddress = '0xdAC17F958D2ee523a2206206994597C13D831ec7';
  const usdtContract = new web3.eth.Contract(contractABI, contractAddress);
  
  try {
    const balance = await usdtContract.methods.balanceOf(address).call();
    setUsdtBalance(balance);
  } catch (error) {
    console.error('获取USDT余额失败:', error);
    setUsdtBalance(null);
  }
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 12:50:12