This is my code:
interface Siswa {
name: string,
points: { a: number, b: number, c: number, d?: number, e?: number }
}
function find_average_points(data: Array<Siswa>): Array<{name: string, average: number}> {
let returned_array: Array<{name: string, average: number}> = [];
data.forEach((item: Siswa) => {
let sum: number = 0;
let keys = Object.keys(item.points);
keys.forEach((key: any) => sum+=item.points[key]);
returned_array.push({name: item.name, average: (sum/keys.length)});
});
return returned_array;
}
When I tried this function in JavaScript, it ran correctly and the result is what I want, but in TypeScript, I got an error in item.points[key]. It says:
Element implicitly has an 'any' type because expression of type 'string' can't be used to index type '{ a: number; b: number; c: number; d?: number | undefined; e?: number | undefined; }'.
No index signature with a parameter of type 'string' was found on type '{ a: number; b: number; c: number; d?: number | undefined; e?: number | undefined; }'
I don't know what it means.
Using
Object.keys()returns the typestring[](as explained in this comment). Instead, you can create arrays for the known keys in thepointsobject, use them to build your types, and then loop through those keys when summing the values:TS Playground link