Hardhat部署脚本报错:BaseContract不存在PROPOSER_ROLE属性
解决TypeScript报错:Property 'PROPOSER_ROLE' does not exist on type 'BaseContract'
这个错误的核心原因是TypeScript无法识别TimeLock合约继承自TimelockController的角色常量——要么是生成的合约类型定义未包含这些继承属性,要么是合约实例被默认推断为BaseContract类型。以下是几种可行的解决方法:
方法1:重新生成TypeChain类型定义
Hardhat依赖TypeChain生成合约的TypeScript类型定义,若类型定义未更新就会出现属性不识别问题:
- 执行命令重新生成类型:
npx hardhat typechain
- 在脚本中导入正确的合约类型并强制转换:
import { TimeLock } from "../typechain-types"; // ... const timeLock = await ethers.getContract("TimeLock", deployer) as TimeLock;
这样TypeScript就能正确识别合约的所有属性和方法。
方法2:直接计算角色哈希值
由于这些角色常量是固定的keccak256哈希值,你可以在脚本中直接计算,无需从合约获取:
import { ethers } from "hardhat"; // ... const PROPOSER_ROLE = ethers.utils.keccak256(ethers.utils.toUtf8Bytes("PROPOSER_ROLE")); const EXECUTOR_ROLE = ethers.utils.keccak256(ethers.utils.toUtf8Bytes("EXECUTOR_ROLE")); const TIMELOCK_ADMIN_ROLE = ethers.utils.keccak256(ethers.utils.toUtf8Bytes("TIMELOCK_ADMIN_ROLE")); // 直接使用这些常量 const proposerTx = await timeLock.grantRole(PROPOSER_ROLE, governance.address);
方法3:使用括号语法绕过类型检查
如果不想修改类型定义或计算哈希,可以用括号语法强制访问属性:
const proposerRole = await timeLock["PROPOSER_ROLE"](); const executorRole = await timeLock["EXECUTOR_ROLE"](); const adminRole = await timeLock["TIMELOCK_ADMIN_ROLE"]();
这种方法可临时解决类型报错,但不推荐长期使用,会失去TypeScript的类型安全保障。
内容的提问来源于stack exchange,提问作者Sagar Atalatti
相关产品推荐
相关产品推荐

