TypeScript对象映射函数编译报错:‘Expected an assignment or function call and instead saw an expression’问题求解
解决TypeScript编译错误:Expected an assignment or function call and instead saw an expression
嘿,我来帮你拆解这个问题~你遇到的这个编译错误,本质是TypeScript认为你写了一段“没有实际用途的表达式”——也就是那个三元运算符的结果既没被赋值给变量,也没被当作函数调用,属于无效代码。
先说说你代码里的两个核心问题:
- 误用了
map方法:map的设计目的是返回一个新数组,它会把回调函数的返回值收集起来生成新数组。但你现在是把map当forEach用,只在里面做listpush.push()的副作用操作,而且三元表达式的else分支返回了null,这些null会被map收集,但你又没用到这个生成的数组,这就导致了无意义的表达式出现。 - 函数名用了关键字:你把函数命名为
function,这是TypeScript的保留关键字,本身就会引发语法错误,得改成合法的名字比如processList之类的。
两种修复方案供你选:
方案1:换成forEach做遍历(适合需要副作用的场景)
既然你只是想遍历并往数组里push元素,用forEach更合适,它不需要回调函数返回值,也就不会产生无意义的表达式:
// 注意:把函数名改成合法的名字,比如processList const processList = (list: IListType | undefined) => { let listpush: AType[] = [] list?.item.forEach(it => { // 用if判断替代三元表达式,更清晰,也不会返回多余的null if (it.values && it.values?.key && it.values?.value) { listpush.push({ attr1: it.name, attr2: it.values.key, attr3: it.values.value, }) } }) }
方案2:正确使用map+filter(函数式风格,更简洁)
如果你的目标是生成符合条件的新数组,直接用filter先筛选出合格的项,再用map转换结构,完全不需要手动维护listpush变量:
const processList = (list: IListType | undefined): AType[] => { // 先过滤出符合条件的项,再转换结构,最后返回空数组兜底 return list?.item ?.filter(it => it.values && it.values?.key && it.values?.value) .map(it => ({ attr1: it.name, attr2: it.values.key, attr3: it.values.value, })) || [] }
最后再强调下错误根源:
TypeScript的这个报错就是在提醒你:“你写了一段表达式,但它的结果没被使用,这可能是个bug哦”。要么是你用错了遍历方法,要么是你留下了不必要的表达式(比如那个返回null的三元分支),调整之后就能解决啦~
内容的提问来源于stack exchange,提问作者Catarina Nogueira
相关产品推荐
相关产品推荐

