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

使用ethers.js/Hardhat+TypeScript时数组打印undefined问题求助

问题:Hardhat+TypeScript测试中console.log(addresses)输出undefined

错误原因

  1. 全局变量未初始化:addresses仅做了类型声明但未初始化数组,初始值为undefined,直接调用push操作无法生效。
  2. 异步操作未等待:使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 09:27:29