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,属于逻辑问题,和本次语法报错无关。
修复方法
- 修正语法错误:删掉
[k]前面多余的点,把curr.[k]?.[0]改成curr[k]?.[0]即可解决当前的语法报错。 - 建议顺手优化:把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
相关产品推荐
相关产品推荐

