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

测试MetaMask时遇类型错误:Window类型不存在ethereum属性

解决Mocha测试中Property 'ethereum' does not exist on type 'Window & typeof globalThis'错误

问题背景

你的项目文件夹结构如下:

src/
   |index.ts
   |global.d.ts
   |test/
        |myTest.ts

global.d.ts中扩展了Window接口以支持MetaMask的ethereum属性:

interface Window {
  ethereum: any
}

使用eth-testing库在Mocha测试中Mock MetaMask时,给global.window.ethereum赋值时出现类型错误,即使调整测试文件夹位置也无法解决。

可行解决方案

1. 确保TypeScript配置覆盖测试文件

检查你的tsconfig.json配置,确保include字段包含测试文件路径,同时typeRoots包含类型定义所在的目录:

{
  "compilerOptions": {
    // 保留你的其他编译配置
    "typeRoots": ["./node_modules/@types", "./src"],
    "include": [
      "src/**/*",
      "test/**/*" // 测试文件在src外时添加这行,在src内则src/**/*已覆盖
    ]
  }
}

这样TypeScript在编译测试代码时,会自动加载global.d.ts中的类型扩展。

2. 在测试文件中局部扩展Window类型

如果不想修改全局配置,可以在测试文件顶部直接声明全局类型扩展:

declare global {
  interface Window {
    ethereum: any;
  }
}

// 你的测试代码
describe("wallet detection", () => {
  const testingUtils = generateTestingUtils({ providerType: "MetaMask" });

  it('metamask detection', async () => {
      global.window.ethereum = testingUtils.getProvider();
      // ... 剩余测试逻辑
  })
})

这种方式只在当前测试文件生效,无需依赖外部的global.d.ts。

3. 使用类型断言临时绕过检查

如果只是快速验证测试逻辑,可以用类型断言强制跳过类型检查:

// 方式1:直接断言为any
(global.window as any).ethereum = testingUtils.getProvider();

// 方式2:更精确的类型断言
(global.window as Window & { ethereum: any }).ethereum = testingUtils.getProvider();

问题原因分析

之前的方案无效,大概率是因为测试文件不在TypeScript的include范围内,导致编译测试代码时没有加载到global.d.ts中的Window扩展;或者Mocha使用的ts-node等工具没有正确读取你的tsconfig配置,导致类型定义未被加载。

内容的提问来源于stack exchange,提问作者matty

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 02:25:46