У меня есть функция в машинописи, которая теоретически должна обновлять все ключи в объекте и добавлять к ним дополнительный текст:
interface Type {
[key: string]: string;
}
function changeKeys<T extends Type>(obj: T) {
let result: Partial<T> = {};
if (!Array.isArray(obj)) {
for (const [key, val] of Object.entries(obj)) {
result[key + "-updated"] = val;
}
}
return result as T;
}
Поскольку я использовал цикл for of, мне нужно было создать партиал. Но я получаю эту ошибку из машинописного текста, когда пытаюсь скомпилировать код: Type 'string' cannot be used to index type 'Partial<T>'.
Теперь партиал определяется как объект, и я даже проверяю, не является ли переданный общий массив массивом, поэтому тогда я не получаю ошибку - index type = индексация массива? Каким было бы подходящее решение и объяснение этой ошибки в данном конкретном случае?
Выражение
key + "-updated"
имеет типstring
. Стоит отметить, что ваши аннотации типа не имеют никакого смысла, потому что вы возвращаете объект с совершенно другим набором ключей, чем тип вводаT
, и предположение, что такой объект являетсяPartial<T>
, сильно вводит в заблуждение.Почему это общий код вообще, а не просто
function changeKeys(obj: Type) {...}
? С универсальной функцией вы можете вызватьchangeKeys({a: ""})
, и компилятор сделает вывод, чтоT
— это{a: string}
. Неизвестно, что значение типа{a: string}
имеет ключ с именем"a-updated"
и сигнатуру строкового индекса, поэтому вы не можете установить его свойствоkey + "-updated"
.Ага! Я тупой - можете ли вы опубликовать свой комментарий в качестве ответа или я должен удалить этот пост целиком?