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

