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

TypeScript遍历JSON数组报Identifier Expected错误如何解决

报错原因

这个Identifier Expected(标识符预期)是纯语法错误,根源是对象属性访问的写法不符合JS/TS语法规则:

  • JS/TS访问对象属性只有两种合法写法,不能混用:
    • 点号写法:对象.固定属性名,点后面必须跟直接写死的合法标识符属性,比如person.name
    • 方括号写法:对象[动态属性表达式],方括号里可以放变量、字符串、表达式来动态指定属性名,比如person[keyVar]
  • 你写的curr.[k]把两种写法拼到一起了:点号后面没接合法的属性名,直接放了方括号,解析器读到点之后本来等着读一个属性名标识符,结果碰到[,直接抛出标识符预期的错误。

额外提一句,代码里那个类型断言写得不对:你split字符串得到的是['rohit','sharma','my','name'],这几个值根本不是Person接口的属性(Person只有name、age、email三个属性),强行断言成keyof typeof person虽然能过TS类型检查,但运行时取属性会拿到undefined,属于逻辑问题,和本次语法报错无关。

修复方法
  1. 修正语法错误:删掉[k]前面多余的点,把curr.[k]?.[0]改成curr[k]?.[0]即可解决当前的语法报错。
  2. 建议顺手优化:把map回调里的参数名改成和外层k不同的名字(比如key),避免变量遮蔽导致的逻辑混乱;调整错误的类型断言写法,如果你要实现逐层读取嵌套属性的逻辑,需要重新调整遍历取值的代码。

修复后可正常运行的完整示例代码:

import { isArray } from 'lodash'; 

const myObj = {
  "allData" :{
   "person" : [
    {
        "name":"John", 
        "age":30, 
        "email":"djsbjb"
    },
    {
        "name":"rohit.sharma.my.name", 
        "age":20, 
        "email":"fdbfhdbfn"
    }
   ]
  }
};

interface Person {
  name: String,
  age: number,
  email?: String
}

const example = (person: Person) => {
  const keyPath = myObj.allData.person[1].name.split('.');
  console.log(`output of keyPath: ${keyPath}`);
  const curr = { ...person};
  console.log(`output of curr: ${curr}`);
  if (!curr) {
    return;
  } 

  const ans = keyPath.map((key) => 
    isArray(curr[key as keyof Person]) ? curr[key as keyof Person]?.[0] : curr[key as keyof Person]
  ); 

  return ans;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 09:57:19