【发布时间】:2021-07-23 22:40:07
【问题描述】:
const count= data.reduce((s:any, {(value:any)}) => s + value, 0);
我正在尝试向“值”添加一个新类型,它显示未执行的令牌,我是键入脚本的新手,请帮助
【问题讨论】:
标签: reactjs typescript react-typescript
const count= data.reduce((s:any, {(value:any)}) => s + value, 0);
我正在尝试向“值”添加一个新类型,它显示未执行的令牌,我是键入脚本的新手,请帮助
【问题讨论】:
标签: reactjs typescript react-typescript
这里有几个问题:
value: any 部分周围不应有任何()。{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 −−−−−−−−−−−−−−−^^^^^^^^^^^^^^
一般来说,any 类型注释不是最佳实践。您还没有展示data 是什么,但在大多数情况下,您根本不需要在回调的参数上添加类型注释。例如,假设data 是{value: number;}[] - 一个对象数组,其具有value 属性是一个数字。鉴于 data 的类型,TypeScript 根本不需要对该 reduce 调用进行任何类型注释:
const count = data.reduce((s, {value}) => s + value, 0);
TypeScript 从结尾处的0 和data 的定义中知道s 和value 都是数字,并且结果将是一个数字。
在评论中,您曾问过如何使用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 −−−−−−−−−−−−−−−−−−−−−−−−−−−−−^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^−−−−−−−^^^^^^^^
// ....
}
【讨论】:
this.data 的类型,它就知道那些解构参数的类型。但是如果你做了,你会像上面那样做,但类型中有更多属性:this.data.forEach(({value, text, color}: {value: typeOfValue; text: typeOfText; color: typeOfColor; }) => { /*...*/ })。 (但forEach 不再是真正的最佳实践,除非您将预定义的函数传递给它。请改用for-of:for (const {value, text, color} of this.data) { /*...*/ }。
forEach 非常适合。 :-D 对不起,我看到你上面确实有index!您确实有一个替代方案,即for (const [index, {value, text, color}] of this.data.entries()),但虽然我喜欢语义,但它涉及很多临时对象。但它们是可以彻底优化的临时对象……嗯……我感觉正在进行优化测试。 :D