typescript - Hur kan jag iterera genom nycklarna i ett objekt när nycklarna inte är strängar?


För olika konfigurationer (parametrar etc.) i min app tycker jag om att använda objekt. Nycklarna i objekten är inte strängar, utan enums.

När nycklarna inte är strängar, hur kan jag iterera genom nycklarna och få varje nyckel som rätt enum-typ?

Exempel :

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?
})

Svar #1

Du kan använda en karta om du behöver att nyckeln ska vara något annat än en sträng.

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);

Ett annat alternativ är att omvandla colorsKeyStr till ett nummer.

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;
})

Svar #2

colorKeyStr returnerar nyckeln som är ett nummer. Du kan använda numret för att hitta posten i det faktiska enumet, med syntaxen 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
})