Ошибка при сокращении в машинописном тексте. Элемент неявно имеет тип «любой», поскольку выражение типа

У меня есть этот код. По сути, это объект оценок учащихся.

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}

Заранее спасибо.

Можете ли вы привести пример ввода и ожидаемого результата?

Lã Ngọc Hải 30.05.2024 12:05
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
3
1
67
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вам необходимо установить тип «v», поскольку строку нельзя использовать в качестве типа индекса, например.

Object.keys(students).reduce((c, v) => {
  c[v as typeOf keyOf students] = 111;

  return c;
}, {});

1) Это даже не скомпилируется, потому что это недопустимый TypeScript. Может быть вы имели в виду v as keyof typeof students? 2) Это не решит проблему. Вы просто получите сообщение «Элемент неявно имеет тип «любой», поскольку выражение типа «строка | число» не может использоваться для индексации типа «{}». ошибка.

Robby Cornelissen 31.05.2024 04:48

Вам действительно следует запустить свой код, чтобы увидеть, работает ли он, прежде чем публиковать его.

WestMountain 31.05.2024 04:50
Ответ принят как подходящий

Я думаю, что число, которое вы используете, преобразуется в строку, поэтому вы можете просто использовать строку в качестве ключа (хотя это не имеет отношения к проблеме здесь). Вы можете решить проблему, добавив

{} 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);

Playground link

Хорошо, это лучше, чем мой ответ, спасибо, что поделились этими знаниями!

WestMountain 31.05.2024 04:52

Другие вопросы по теме