TypeScript преобразует любой типизированный массив в общий массив значений ключа

#typescript

#typescript

Вопрос:

У меня есть различные данные массива, которые выглядят следующим образом:

 Countries: [{code: "USA", countryDesc: "United States"},{code: "MEX", countryDesc: "Mexico"}]
  

и

 States: [{code: "NY", countryDesc: "New York"},{code: "VA", stateDesc: "Virginia"}]
  

То, что я хочу иметь возможность сделать, это преобразовать конкретный code / countryDesc или code / stateDesc в «общую» пару значений ключа для использования. Следовательно, моя процедура преобразования предоставит мне это:

 [{key:"USA", value:"United States"},{key:"MEX", value:"Mexico"}]
  

и

 [{key:"NY", value:"New York"},{key:"VA", value:"Virginia"}]
  

Моя цель — написать функцию, которая принимает массив и имена свойств для ключа и значения, а затем преобразует их в массив с ключом и значением вместо других имен свойств.

Что у меня есть, так это:

 export interface IAnyArray {
  key: string;
  value: string;
}

const convertToKeyValue = (
  array: IAnyArray[],
  keyname: string,
  valuename: string
) => {
  if (array amp;amp; array.length > 0) {
    return array.map((a) => {
      return { key: a[keyname], value: array[valuename] };
    });
  }
};
  

Я получаю сообщение об ошибке:

Элемент неявно имеет тип ‘any’, поскольку выражение типа ‘string’ нельзя использовать для индексации типа ‘IAnyArray’. Для типа ‘IAnyArray’.ts (7053) не найдено подписи индекса с параметром типа ‘string’.

как для [keyname], так и для [valuename] в функции.

Вот как я бы это сделал, в зависимости от ввода, но я бы хотел, чтобы «общий» механизм, если это возможно:

   const convertCountriesToKeyValue = (
    countries: { code: string; countryDesc: string }[]
  ) => {
    return countries.map((country) => {
      return { key: country.code, value: country.countryDesc };
    });
  };
  

Я искал в Интернете, и я не могу найти ничего полезного, чтобы помочь с этой проблемой.

Я был бы признателен за любую помощь в этом. Спасибо.

Ответ №1:

Если я правильно понял ваш вопрос, вы хотите передать массив объектов с любыми именами свойств, но вернуть IAnyArray . Может быть, что-то вроде этого?

 const convertToKeyValue = <T extends any>(
    array: T[],
    keyname: keyof T,
    valuename: keyof T
) => {
    return array.map((a) => {
        return { key: a[keyname], value: a[valuename] };
    });
};

const countries = [{ code: "USA", countryDesc: "United States" }, { code: "MEX", countryDesc: "Mexico" }];

const keyValueCountries = convertToKeyValue(countries, "code", "countryDesc");
  

Игровая площадка

Ответ №2:

Из вашего описания это должно быть то, что вы ищете:

 const convertToKeyValue = (
  array: IAnyArray[],
  keyName: string,
  valueName: string
) => {
  return array.map((a) => {
    return {[keyName]: a.key, [valueName]: a.value}
  })
}
  

Ссылка на игровую площадку

Примечание: я бы рекомендовал сохранить keyName и valueName в качестве первых двух параметров (как я сделал на игровой площадке), чтобы сделать функцию более составной, если вы решите использовать ее в будущем.