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

Polygon网络P2P支付dApp合约实例创建报错:bigint无法作为索引类型

问题:TypeScript报错“Type 'bigint' cannot be used as an index type”

我在Polygon网络开发点对点支付dApp时,执行加载钱包逻辑、创建PaymentToken合约实例时触发以下TypeScript错误:
Type 'bigint' cannot be used as an index type.ts(2538)

错误出现在前端代码的这一行:
const paymentTokenData = PaymentToken.networks[networkId];

前端代码片段

const loadWallet = async () => {
    if (window.ethereum) {
      window.web3 = new Web3(window.ethereum);
      await window.ethereum.enable();
      const web3 = window.web3;
      var allAccounts = await web3.eth.getAccounts();
      setAccount(allAccounts[0]);

      const web3_ = new Web3(window.web3.currentProvider);
      const networkId = await web3.eth.net.getId();

      // 报错行
      const paymentTokenData = PaymentToken.networks[networkId];
      if (paymentTokenData) {
        var paymentTokenInstance = new web3.eth.Contract(
          PaymentToken.abi,
          paymentTokenData.address
        );
        setPaymentToken(paymentTokenInstance);
        var bal = await paymentTokenInstance.methods
          .balanceOf(allAccounts[0])
          .call();
        setBalance(bal);
      } else {
        window.alert("TestNet not found");
      }
      setLoading(false);
    } else {
      window.alert("Non-Eth browser detected. Please consider using MetaMask.");
    }
  };

合约代码(contract/PaymentToken.sol)

// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.19;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";

contract PaymentToken is ERC20 {
    address public owner;

    constructor() ERC20("Payment Token", "Pay") {
        owner = msg.sender;
        _mint(msg.sender, 100000 * 10**18);
    }

    function mint(address to, uint256 amount) external {
        require(msg.sender == owner, "Only owner can mint");
        _mint(to, amount);
    }
}

解决方案
  • 错误原因:web3.js v1.x版本中,web3.eth.net.getId()返回值类型是bigint,但合约编译生成的PaymentToken.networks对象的键是number类型,TypeScript不允许用bigint作为索引值。

  • 方法一:转换networkId为number类型
    直接将获取到的networkId转为number,这是最直观的解决方式:

    const networkId = Number(await web3.eth.net.getId());
    

    转换后即可正常用networkId访问PaymentToken.networks。

  • 方法二:使用类型断言(特殊场景)
    如果需要保留bigint类型,可以通过类型断言让TypeScript跳过类型检查:

    const paymentTokenData = PaymentToken.networks[networkId as unknown as number];
    
  • 额外检查:确认合约编译生成的PaymentToken.json中,networks字段的键是数字类型(比如Polygon Mumbai测试网的80001),如果是字符串类型,需要转换为数字后再访问。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 10:44:51