【问题标题】:Function to map an object throws "Expected an assignment or function call and instead saw an expression"映射对象的函数抛出“预期赋值或函数调用,而是看到一个表达式”
【发布时间】:2021-11-21 05:32:06
【问题描述】:

我在 TypeScript 上有这个函数,由于以下错误,我无法编译:

期待一个赋值或函数调用,但看到一个表达式

即使在 Stack Overflow 上搜索,我也不太明白为什么。

const function = (list: IListType | undefined) =>{
   let listpush: AType[]=[]
    list?.item.map(
        it =>
        {(it.values && it.values?.key && it.values?.value)?
            listpush.push({
                attr1: it.name,
                attr2: it.values.key,
                attr3: it.values.value,
            }):null
        }
    )
}

【问题讨论】:

  • 请注意,我们更喜欢这里的技术写作风格。我们轻轻地劝阻问候,希望你能帮助,谢谢,提前感谢,感谢信,问候,亲切的问候,签名,请你能帮助,聊天材料和缩写 txtspk,恳求,你多久了被卡住、投票建议、元评论等。只需解释您的问题,并展示您尝试过的内容、预期的内容以及实际发生的情况。

标签: reactjs typescript assign


【解决方案1】:

您正在使用名为Optional chaining 的新javascript 功能,该功能仅在typescript 3.7 之后才受支持。确保您的 React 项目中至少有 version 3.7 或更新版本。

请记住,map 用于转换数组,您必须为回调中的每个项目返回一个值。我在下面的示例中将其更改为forEach

const myFunction = (list: IListType | undefined) =>{
    let listpush: AType[]=[];

    list?.item.forEach(it => {
        if(it.values && it.values?.key && it.values?.value){
            listpush.push({
                attr1: it.name,
                attr2: it.values.key,
                attr3: it.values.value,
            })
        }
    })

    return listpush;
}

替代方法是使用filtermap

const myFunction = (list: IListType | undefined): AType[] => {
    if(!list){
        return [];
    }

    return list.item.filter(it => {
        return it.values && it.values?.key && it.values?.value;
    }).map(item => ({
        attr1: it.name,
        attr2: it.values.key,
        attr3: it.values.value,
    }))
}

【讨论】:

  • 这是一个很好的答案!我正在使用 typescript 3.7+,所以我采用了你的第一个惊人的解决方案:)。只是一个问题,在这部分“if(it.values && it.values?.key && it.values?.value){}”为什么打字稿不接受它与“?”构造函数代替“if”,例如“(it.values && it.values?.key && it.values?.value)?{}”。再次感谢!
  • 该错误似乎是由于使用map而没有在闭包中返回值造成的。这可能是来自 eslint 的 linting 规则,因为您的打字稿是有效的:typescriptlang.org/play?#code/…
【解决方案2】:

错误一:没有返回值

错误2:'function'是关键字,不能用作标识符

误解:使用 Array.map() 而不是 forEach 和缓冲区变量

误解:使函数参数可以为空,而不是期望“未定义”(这也是一样的)

重构建议:使用过滤器删除不想映射的元素

const mapperFunction = (list?: IListType): AType[] =>
    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 }))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-09
    • 2017-12-25
    • 1970-01-01
    • 2019-04-22
    • 2020-02-12
    • 2019-10-15
    • 2020-11-08
    相关资源
    最近更新 更多