Estoy tratando de convertir mi función de Javascript a una versión de Typescript, pero no puedo deshacerme del código subrayado leído acc[curr.name] (en VSCode). Que dice al pasar el cursor sobre él:
El elemento tiene implícitamente un tipo 'cualquiera' porque la expresión de tipo 'cadena' no se puede usar para indexar el tipo '{}'. No se encontró ninguna firma de índice con un parámetro de tipo 'cadena' en el tipo '{}'.
Estoy contando las ocurrencias por nombre clave.
¿Dónde debo definir el tipo y por qué no funciona un objeto vacío o un objeto con número? No estoy seguro de cómo resolverlo ya que probé varias cosas, como por ejemplo:
data.reduce<{}>() y data.reduce<{property: number}>()
Código:
const data = [ { name: "name1", }, { name: "name1", }, { name: "name1", }, { name: "name1", }, { name: "name2", }, { name: "name2", }, { name: "name2", }, { name: "name1", }, ]; // count data by key name const resultData = data.reduce((acc, curr) => { return acc[curr.name] ? ++acc[curr.name] : (acc[curr.name] = 1), acc; }, {});Resultado al ejecutar:
const resultData = { name1: 4, name2: 3, name3: 1, };Establezca una firma de índice como data.reduce<{ [index: string]: number }>
Ref: https://www.typescriptlang.org/docs/handbook/2/objects.html#index-signatures
const resultData = data.reduce<{ [index: string]: number }>((acc, curr) => { return acc[curr.name] ? ++acc[curr.name] : (acc[curr.name] = 1), acc; }, {}); O puede usar as palabra clave con valor inicial.
const resultData = data.reduce((acc, curr) => { return acc[curr.name] ? ++acc[curr.name] : (acc[curr.name] = 1), acc; }, {} as { [index: string]: number });