У меня есть этот код. По сути, это объект оценок учащихся.
let students: {
[k: number]: string[]
} = {};
students[1] = ["Student 1", "Student 2"];
students[2] = ["Student 3", "Student 4"];
console.info(students);
Object.keys(students).reduce((c, v) => {
c[v] = 111; //Im assigning some values here. THE ERROR IS POINTING HERE
return c;
}, {});Ошибка, которую я получаю:
Элемент неявно имеет тип «любой», поскольку выражение типа «строка» не может использоваться для индексного типа «{}». Нет индексной подписи с параметр типа «строка» найден в типе «{}»
Ожидаемый результат должен быть таким: 111 — это просто фиктивные данные. Я собираюсь разместить там более важные данные.
{1: 111, 2: 111}
Заранее спасибо.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вам необходимо установить тип «v», поскольку строку нельзя использовать в качестве типа индекса, например.
Object.keys(students).reduce((c, v) => {
c[v as typeOf keyOf students] = 111;
return c;
}, {});
1) Это даже не скомпилируется, потому что это недопустимый TypeScript. Может быть вы имели в виду v as keyof typeof students? 2) Это не решит проблему. Вы просто получите сообщение «Элемент неявно имеет тип «любой», поскольку выражение типа «строка | число» не может использоваться для индексации типа «{}». ошибка.
Вам действительно следует запустить свой код, чтобы увидеть, работает ли он, прежде чем публиковать его.
Я думаю, что число, которое вы используете, преобразуется в строку, поэтому вы можете просто использовать строку в качестве ключа (хотя это не имеет отношения к проблеме здесь). Вы можете решить проблему, добавив
{} as { [k: string]: any }
type Student = {
[k: string]: string[];
};
let students: Student = {};
students[1] = ["Student 1", "Student 2"];
students[2] = ["Student 3", "Student 4"];
console.info(students);
const keys = Object.keys(students);
const foo = keys.reduce(
(c, v) => {
c[v] = 111;
return c;
},
{} as { [k: string]: any },
);
console.info("foo", foo);
Функция reduce() типизирована как универсальная функция , которая принимает параметр типа, поэтому вам не нужно прибегать к использованию утверждения типа:
type Student = {
[k: string]: string[];
};
const students: Student = {};
students[1] = ["Student 1", "Student 2"];
students[2] = ["Student 3", "Student 4"];
const keys = Object.keys(students);
const foo = keys.reduce<{[k: string]: any}>(
(c, v) => {
c[v] = 111;
return c;
},
{},
);
console.info("foo", foo);
Хорошо, это лучше, чем мой ответ, спасибо, что поделились этими знаниями!
Можете ли вы привести пример ввода и ожидаемого результата?