Тип «строка» не может использоваться для индексации типа «Partial<T>».

avatar
Simon Dubek
1 июля 2021 в 17:08
250
1
0

У меня есть функция в машинописи, которая теоретически должна обновлять все ключи в объекте и добавлять к ним дополнительный текст:

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 = индексация массива? Каким было бы подходящее решение и объяснение этой ошибки в данном конкретном случае?

Источник
Aluan Haddad
1 июля 2021 в 17:13
0

Выражение key + "-updated" имеет тип string. Стоит отметить, что ваши аннотации типа не имеют никакого смысла, потому что вы возвращаете объект с совершенно другим набором ключей, чем тип ввода T, и предположение, что такой объект является Partial<T>, сильно вводит в заблуждение.

jcalz
1 июля 2021 в 17:14
0

Почему это общий код вообще, а не просто function changeKeys(obj: Type) {...}? С универсальной функцией вы можете вызвать changeKeys({a: ""}), и компилятор сделает вывод, что T — это {a: string}. Неизвестно, что значение типа {a: string} имеет ключ с именем "a-updated" и сигнатуру строкового индекса, поэтому вы не можете установить его свойство key + "-updated".

Simon Dubek
1 июля 2021 в 17:19
0

Ага! Я тупой - можете ли вы опубликовать свой комментарий в качестве ответа или я должен удалить этот пост целиком?

Ответы (1)

avatar
devdgehog
1 июля 2021 в 17:22
0

Вот что я бы сделал, вам вообще не нужно использовать Partial:

type Type = Record<string, string>;

function changeKeys(obj: Type) {
  const result: Type = {};
  if (!Array.isArray(obj)) {
    for (const [key, val] of Object.entries(obj)) {
      result[`${key}-updated`] = val;
    }
  }
  return result;
}

const test = {
  a: "test",
};

console.log(changeKeys(test));

https://www.typescriptlang.org/play?ssl=17&ssc=31&pln=1&pc=1#code/C4TwDgpgBAKu0F4oCUIGMD2AnAJgHgGdgsBLAOwHMAaKI0ygPgG4AoFgMwFcy1gSMyUNAAsAhpQgBpCCAIAKDACMAVgC5Y8AJRQA3iyhCBRKFggFOAG2Dq4kKEh0BfVgZLsocgIQBBLFlEgAHQkBL7+IAoqmtp6Bgbs2B6YZMYA2gDWMjQAbqIWALpQGO4A8irowIEQZMQkZpHK0br6cQam5lapAAYAJDqZII4AtJxgOKLAEDhdhUi5Fi5xji3LbRDAnFiC7ZbArMssycaTxg4touoARCfAl1QszmxHGBYQgRYYFHIi4hRSMvIbtEmEA