В настоящее время я пытаюсь преобразовать некоторый реагирующий нативный код в машинописный текст, и есть несколько функций сокращения, которые выдают ошибки. Как я могу переписать это, чтобы у меня не было проблем с типом при запуске?
Я пробовал разные способы ввода функции, а также ожидаемого результата, но пока безуспешно.
myArray: data.items.reduce( (map: object, obj: myInterface) : object => { map[obj.id] = obj; return map; }, [])
элемент myArray моего объекта должен быть заполнен массивом элементов, определенных в myInterface. Когда я запускаю, я получаю следующую ошибку.
TypeScript error in MyPath/:
Element implicitly has an 'any' type because expression of type 'number' can't be used to index type '{}'.
No index signature with a parameter of type 'number' was found on type '{}'. TS7053
128 | appVersion: data.version || "",
129 | offline: false,
130 | myArray: data.items.reduce( (map: object, obj: myInterface) : object => { map[obj.id] = obj; return map; }, [])
| ^
131 | });
О да, это тоже проблема
Ваша карта имеет тип объекта. Вы должны указать объект в качестве начального значения для функции сокращения.
myArray: data.items.reduce(
(map: Record<myInterface['id'], myInterface>, obj: myInterface): Record<myInterface['id'], myInterface> =>
{ map[obj.id] = obj; return map; },
{})
Объявление map: Record<myInterface['id'], myInterface>
может быть лучше, если id
ограничено больше, чем string | number | symbol
да, это безопасно
Ответ Патрика Роберта исправил это. Спасибо!
myArray: data.items.reduce( (map: Record<myInterface['id'], myInterface>, obj: myInterface) : object => { map[obj.id] = obj; return map; }, {})
Вы не можете назначать свойства объекту в этих условиях. Попробуйте заменить
object
вmap: object
на это:[propName: string]: any
вот так:map: {[propName: string]: any}