【问题标题】:Unexpected token while adding a type to "value"向“值”添加类型时出现意外标记
【发布时间】:2021-07-23 22:40:07
【问题描述】:
 const count= data.reduce((s:any, {(value:any)}) => s + value, 0);

我正在尝试向“值”添加一个新类型,它显示未执行的令牌,我是键入脚本的新手,请帮助

【问题讨论】:

    标签: reactjs typescript react-typescript


    【解决方案1】:

    这里有几个问题:

    1. value: any 部分周围不应有任何()
    2. 您不能像这样提供内联解构参数的类型,因为它与解构语法的重命名功能相冲突。 {value: any} 表示“取value 的值并将其放入名为any 的变量/参数中。

    要将类型赋予解构模式,请将模式作为一个整体输入:

    // The destructured parameter −−−−−−vvvvv
    const count = data.reduce((s: any, {value}: {value: any}) => s + value, 0);
    // The type for the object −−−−−−−−−−−−−−−^^^^^^^^^^^^^^
    

    Playground link


    一般来说,any 类型注释不是最佳实践。您还没有展示data 是什么,但在大多数情况下,您根本不需要在回调的参数上添加类型注释。例如,假设data{value: number;}[] - 一个对象数组,其具有value 属性是一个数字。鉴于 data 的类型,TypeScript 根本不需要对该 reduce 调用进行任何类型注释:

    const count = data.reduce((s, {value}) => s + value, 0);
    

    TypeScript 从结尾处的0data 的定义中知道svalue 都是数字,并且结果将是一个数字。


    在评论中,您曾问过如何使用forEach 执行此操作,您还需要索引。同样,您可能不需要指定类型,当然也不需要指定 index 的类型,因为 TypeScript 知道 forEach 回调中的类型。但是如果你这样做了,因为 index 没有被解构,你只需指定它的内联类型:

    // If TypeScript knwos the type of `this.data`, you DON'T NEED THESE TYPES
    this.data.forEach(({value, text, data}: {value: typeOfValue; text: typeOfText; data: typeOfData}, index: number) => {
    // Types −−−−−−−−−−−−−−−−−−−−−−−−−−−−−^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^−−−−−−−^^^^^^^^
        // ....
    }
    

    【讨论】:

    • 如果有超过 1 个这样的参数,我如何销毁 this.data.forEach(({value, text, data}, index) => {
    • @Tej - ("destructure") 通常,您不必再指定这些类型。如果 TypeScript 知道 this.data 的类型,它就知道那些解构参数的类型。但是如果你做了,你会像上面那样做,但类型中有更多属性:this.data.forEach(({value, text, color}: {value: typeOfValue; text: typeOfText; color: typeOfColor; }) => { /*...*/ })。 (但forEach 不再是真正的最佳实践,除非您将预定义的函数传递给它。请改用for-offor (const {value, text, color} of this.data) { /*...*/ }
    • 很好的答案 T.J. - 感谢您让 SO 成为一个更好的地方。
    • 我如何在 for 循环中容纳“索引”
    • @Tej - 如果您需要索引,我会反转自己:forEach 非常适合。 :-D 对不起,我看到你上面确实有index!您确实有一个替代方案,即for (const [index, {value, text, color}] of this.data.entries()),但虽然我喜欢语义,但它涉及很多临时对象。但它们是可以彻底优化的临时对象……嗯……我感觉正在进行优化测试。 :D
    猜你喜欢
    • 2016-02-05
    • 2016-01-07
    • 2011-11-09
    • 1970-01-01
    • 2019-01-21
    • 1970-01-01
    • 2014-11-22
    • 2022-08-14
    • 1970-01-01
    相关资源
    最近更新 更多