如何校验tokens数组中对象是否符合{tokenName: string}格式?
问题分析与修复方案
你的代码存在几个关键问题,导致测试不通过:
- 未检查元素是否为有效对象:如果数组里有
null、undefined或者字符串、数字这类非对象元素,访问tokens[i].tokenName会直接抛出运行时错误,根本走不到错误判断逻辑。 - 属性检查顺序错误:先访问
tokens[i].tokenName再判断hasOwnProperty,如果对象没有这个属性,虽然typeof会返回undefined,但逻辑上应该先确认属性存在,再判断类型。 - 未严格限制对象结构:要求是严格符合
{tokenName: string},意味着对象不能有任何额外属性,你的代码没做这个校验。
修正后的代码
for (let i = 0; i < tokens.length; i++) { const item = tokens[i]; // 检查当前元素是否为非空对象 if (typeof item !== 'object' || item === null) { throw new Error("Invalid array format: element must be an object"); } // 获取对象的所有自有属性名 const keys = Object.keys(item); // 检查是否只有tokenName这一个属性 if (keys.length !== 1 || keys[0] !== 'tokenName') { throw new Error("Invalid array format: object must only contain 'tokenName' property"); } // 检查tokenName的类型是否为字符串 if (typeof item.tokenName !== 'string') { throw new Error("Invalid array format: 'tokenName' must be a string"); } // 符合要求,执行后续逻辑 // do stuff }
关键校验点说明
- 非空对象校验:先排除基本类型和
null,避免后续访问属性时报错。 - 属性数量与名称校验:通过
Object.keys获取所有自有属性,确保只有tokenName这一个键,实现严格结构匹配。 - 类型校验:最后确认
tokenName的类型是字符串,覆盖所有不符合类型的情况。
内容的提问来源于stack exchange,提问作者bko00
相关产品推荐
相关产品推荐

