TypeScript将任何类型化数组转换为通用键值数组

TypeScript将任何类型化数组转换为通用键值数组,typescript,Typescript,我有各种数组数据,如下所示: Countries: [{code: "USA", countryDesc: "United States"},{code: "MEX", countryDesc: "Mexico"}] 及 我希望能够将特定的code/countryDesc或code/stateDesc转换为要使用的“通用”键值对。因此,我的转换程序将为我提供以下信息: [{key:"USA",

我有各种数组数据,如下所示:

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

我希望能够将特定的code/countryDesc或code/stateDesc转换为要使用的“通用”键值对。因此,我的转换程序将为我提供以下信息:

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

我的目标是编写一个函数,该函数接受数组以及键和值的属性名称,然后将它们转换为具有键和值的数组,而不是其他属性名称

我所拥有的是:

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

const convertToKeyValue = (
  array: IAnyArray[],
  keyname: string,
  valuename: string
) => {
  if (array && array.length > 0) {
    return array.map((a) => {
      return { key: a[keyname], value: array[valuename] };
    });
  }
};
我得到了一个错误:

元素隐式具有“any”类型,因为表达式的类型为 “string”不能用于索引类型“IAnyArray”。无索引签名 在类型上找到了类型为“string”的参数 “IAnyArray”ts(7053)

用于函数中的[keyname]和[valuename]

这是我将如何做的,具体到输入,但如果可能的话,我想要一个“通用”机制:

  const convertCountriesToKeyValue = (
    countries: { code: string; countryDesc: string }[]
  ) => {
    return countries.map((country) => {
      return { key: country.code, value: country.countryDesc };
    });
  };
我在网上搜索过,找不到任何有用的东西来帮助解决这个问题


我非常感谢在这方面的任何帮助。谢谢。

如果我正确理解了您的问题,您希望传入任何属性名称的对象数组,但返回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");
const convertToKeyValue=(
数组:T[],
keyname:keyof T,
valuename:keyof T
) => {
返回数组.map((a)=>{
返回{key:a[keyname],value:a[valuename]};
});
};
const countries=[{代码:“美国”,countryDesc:“美国”},{代码:“墨西哥”,countryDesc:“墨西哥”}];
const keyValueCountries=convertTokyValue(国家,“代码”、“国家描述”);

如果我正确理解了您的问题,您希望传入任何属性名称的对象数组,但返回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");
const convertToKeyValue=(
数组:T[],
keyname:keyof T,
valuename:keyof T
) => {
返回数组.map((a)=>{
返回{key:a[keyname],value:a[valuename]};
});
};
const countries=[{代码:“美国”,countryDesc:“美国”},{代码:“墨西哥”,countryDesc:“墨西哥”}];
const keyValueCountries=convertTokyValue(国家,“代码”、“国家描述”);

根据您的描述,这应该是您正在寻找的:

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

旁注:我建议保留
keyName
valueName
作为前两个参数(就像我在操场上做的那样),以便在将来决定使用时使函数更具可组合性


根据您的描述,这应该是您正在寻找的:

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

旁注:我建议保留
keyName
valueName
作为前两个参数(就像我在操场上做的那样),以便在将来决定使用时使函数更具可组合性