如何在TypeScript中声明全局变量?Playwright MY_OBJECT报错解决
解决Playwright中
page.evaluate无法识别全局MY_OBJECT的TypeScript错误 核心原因
page.evaluate的回调函数运行在浏览器上下文,而非Node.js的全局作用域,直接声明全局变量无法让TypeScript关联到浏览器的window对象上。你需要扩展浏览器的Window接口类型,明确MY_OBJECT是window的属性。
正确的类型声明方式
创建或修改global.d.ts(或任意你命名的.d.ts文件),添加以下代码:
interface Window { MY_OBJECT: { someMethod: () => void; }; }
如果需要用全局模块的方式声明(适用于更复杂的全局类型场景):
declare global { interface Window { MY_OBJECT: { someMethod: () => void; }; } } // 必须添加此行,否则TypeScript会将该文件视为模块而非全局类型声明 export {};
确保TypeScript识别声明文件
检查你的tsconfig.json,确认include数组包含了你的.d.ts文件路径,示例配置:
{ "compilerOptions": { /* 你的现有配置 */ }, "include": [ "src/**/*", "./global.d.ts" // 替换为你的声明文件实际路径 ] }
可选写法:显式引用window.MY_OBJECT
如果不想修改全局类型,也可以在回调中直接通过window访问,并配合类型处理:
// 结合全局类型声明后,可直接写 page.evaluate( () => window.MY_OBJECT.someMethod() ) // 临时兼容写法(不推荐长期使用) page.evaluate( () => (window as any).MY_OBJECT.someMethod() )
之前的方式无效的原因
你之前直接声明var MY_OBJECT是在Node.js的全局作用域,而page.evaluate的回调属于浏览器环境,TypeScript不会自动关联这两个不同的全局作用域。只有扩展Window接口,才能让TypeScript识别该对象是浏览器全局环境的一部分。
内容的提问来源于stack exchange,提问作者asliwinski
相关产品推荐
相关产品推荐

