使用TypeScript与Playwright检查传入参数是否在枚举中遇报错求助
问题描述
通过package.json的scripts传递参数,想要检查传入的参数是否存在于枚举中并获取第一个匹配项,逻辑在Playwright测试函数前执行,但代码运行后city为空数组,同时VS Code报错。
相关代码
package.json
"scripts": { "test": "node test Boston" }
enum.ts
export enum testDataCities { boston = `boston`, burbank = `burbank`, peoria = `peoria`, provo = `provo` }
测试文件
import { test, expect } from '@playwright/test' import { testDataCities } from './enum' let city = process.argv.filter(arg => arg in testDataCities)
报错信息
'const' enums can only be used in property or index access expressions or the right hand side of an import declaration or export assignment or type query.
问题原因
- 枚举编译特性限制:TypeScript默认编译时会把普通枚举处理为
const enum(若开启对应编译选项),这种枚举会在编译阶段被完全内联,运行时不存在对应的可遍历对象,因此in操作符无法检测到枚举属性。 - 大小写不匹配:传入的参数是
Boston,但枚举的键和值都是小写的boston,直接匹配会因大小写差异失败。 - 参数范围错误:
process.argv的前两个元素是Node.js路径和当前脚本路径,直接过滤会包含无关内容,无法正确提取自定义参数。
正确实现方式
1. 确保枚举运行时可访问
修改tsconfig.json添加"preserveConstEnums": true,让编译后的代码保留枚举对象;或者直接使用普通枚举(默认编译后会生成可访问的对象):
// enum.ts export enum testDataCities { boston = 'boston', burbank = 'burbank', peoria = 'peoria', provo = 'provo' }
2. 正确处理参数与匹配枚举
提取有效参数、统一大小写后,通过枚举的键或值进行匹配:
import { test, expect } from '@playwright/test' import { testDataCities } from './enum' // 跳过process.argv前两个默认元素,只取自定义传入的参数 const customArgs = process.argv.slice(2) // 匹配枚举值(统一转为小写避免大小写问题) const matchedCity = customArgs.find(arg => { const lowerArg = arg.toLowerCase() return Object.values(testDataCities).includes(lowerArg as testDataCities) }) // 若需要匹配枚举键,可替换为以下逻辑 // const matchedCityKey = customArgs.find(arg => { // const lowerArg = arg.toLowerCase() // return Object.keys(testDataCities).includes(lowerArg) // }) console.log('匹配到的城市:', matchedCity)
3. 适配Playwright脚本(可选)
如果使用Playwright官方命令执行测试,建议调整脚本格式,确保参数正确传递:
"scripts": { "test": "playwright test -- Boston" }
此时依然可以用上述process.argv.slice(2)的方式提取参数,--会将后续参数传递给测试脚本。
内容的提问来源于stack exchange,提问作者Huckleberry Carignan
相关产品推荐
相关产品推荐

