使用ethers.js/Hardhat+TypeScript时数组打印undefined问题求助
问题:Hardhat+TypeScript测试中
console.log(addresses)输出undefined 错误原因
- 全局变量未初始化:
addresses仅做了类型声明但未初始化数组,初始值为undefined,直接调用push操作无法生效。 - 异步操作未等待:使用
Array.map搭配async回调时,map会返回一组Promise,但未等待所有Promise执行完成就结束了beforeEach,导致测试用例执行时addresses还未被填充。
修复方案
步骤1:初始化数组
将全局变量addresses初始化为空数组:
let addresses: string[] = []
步骤2:正确处理异步遍历
替换map为Promise.all+map(或for...of循环),确保所有异步操作完成后再进入测试用例:
方案A:使用Promise.all(更简洁)
beforeEach(async () => { signersWithAddress = await ethers.getSigners() // 用Promise.all等待所有getAddress操作完成,直接生成地址数组 addresses = await Promise.all( signersWithAddress.map(signer => signer.getAddress()) ) })
方案B:使用for...of循环(更直观)
beforeEach(async () => { signersWithAddress = await ethers.getSigners() addresses = [] // 每次测试前重置数组,避免脏数据 for (const signer of signersWithAddress) { addresses.push(await signer.getAddress()) } })
完整修复后的代码
import { SignerWithAddress } from "@nomiclabs/hardhat-ethers/signers" import { ethers } from "hardhat" import { beforeEach, describe, it } from "mocha" let signersWithAddress: SignerWithAddress[] let addresses: string[] = [] // 初始化数组 describe("Basic Test", () => { beforeEach(async () => { signersWithAddress = await ethers.getSigners() addresses = await Promise.all( signersWithAddress.map(signer => signer.getAddress()) ) }) it("Prints every address that we have", () => { console.log(addresses) }) })
运行yarn hardhat test后,控制台会正常输出所有签名者地址数组。
内容的提问来源于stack exchange,提问作者diamind
相关产品推荐
相关产品推荐

