当键不是字符串时,如何遍历对象的键?

时间:2020-07-28 07:49:14

标签: typescript

对于我的应用程序中的各种配置(参数等),我喜欢使用对象。对象的键不是字符串,而是枚举。

当键不是字符串时,如何遍历键并将每个键作为正确的枚举类型获取?

示例:

enum Color {
    RED = 1
}

let colorNames: { [key in Color]?: string } = {
    [Color.RED]: "red"
}

Object.keys(colorNames).forEach(colorsKeyStr => {

    let colorNum: Color = colorsKeyStr // <-- produces error
    // What's the proper way to cast a "color" variable to the "Color" enum type?
})

2 个答案:

答案 0 :(得分:5)

如果您需要密钥是字符串,则可以使用map

enum Color {
  RED = 1,
}

const colorNames: Map<Color, string> = new Map();
colorNames.set(Color.RED, "red");

// Looping over map
colorNames.forEach((value, key) => {
  console.log("key", key);     // Expected: 1
  console.log("value", value); // Expected: "red"
});

// Get single value
const red = colorNames.get(Color.RED);

另一种选择是将colorsKeyStr强制转换为数字。

enum Color {
  RED = 1
}

let colorNames: { [key in Color]?: string } = {
  [Color.RED]: "red"
}

Object.keys(colorNames).forEach(colorsKeyStr => {
  const index = Number(colorsKeyStr);
  let colorNum: Color = index;
})

答案 1 :(得分:1)

colorKeyStr返回数字键。您可以使用Enum[enumValue]语法使用数字查找实际枚举的条目。

enum Color {
  RED = 1
}

let colorNames: {
  [key in Color] ? : string
} = {
  [Color.RED]: "red"
}

Object.keys(colorNames).map(colorName => Color[Number(colorName)]
).forEach(color => {
  console.log(color);
  // You will get the correct color from your enum, but the type is still incorrect
})