使用Truffle+TypeScript获取智能合约地址时遇类型错误求助
解决Truffle+TypeScript获取合约地址的类型错误
问题原因
你遇到的类型错误,本质是TypeScript的类型不匹配:web3.eth.net.getId()返回的是number类型的网络ID,但合约JSON文件中networks对象的键是字符串类型(比如示例里的"1673876271947"),TypeScript不允许用number类型的值去索引键为字符串的对象,因此触发报错。
解决方案
方案1:将networkId转为字符串(最直接推荐)
直接把number类型的networkId转换为字符串,和JSON里的键类型对齐,就能解决索引不匹配的问题:
async loadSmartContracts() { const networkId = await this.web3.eth.net.getId() // 转换为字符串后再索引 const networkData = SmartContractJson.networks[networkId.toString()]; }
方案2:添加合约JSON的类型声明(规范做法)
如果希望TypeScript能正确识别合约JSON的结构并提供类型提示,可以在项目中创建一个类型声明文件(比如src/contracts.d.ts),给合约JSON定义明确的类型:
declare module "*.json" { // 定义单个网络的配置类型 interface NetworkConfig { events: Record<string, unknown>; links: Record<string, unknown>; address: string; transactionHash: string; } // 定义合约JSON的整体类型 interface ContractJson { networks: Record<string, NetworkConfig>; abi: unknown[]; // 按需添加其他字段,比如bytecode、contractName等 } const value: ContractJson; export default value; }
将这个文件放在项目的源码目录下,TypeScript会自动读取该声明,之后再使用networkId.toString()索引时,不仅不会报错,还能获得代码提示。
方案3:临时使用类型断言(仅应急)
如果只是临时跳过类型检查,可以用类型断言强制告诉TypeScript该索引是合法的,但这种方式会绕过TypeScript的类型校验,不推荐长期使用:
async loadSmartContracts() { const networkId = await this.web3.eth.net.getId() const networkData = (SmartContractJson.networks as Record<number, typeof SmartContractJson.networks[string]>)[networkId]; }
内容的提问来源于stack exchange,提问作者Luciano Pulido
相关产品推荐
相关产品推荐

