Iterera över en enum med TypeScript och tilldela till en enum


Jag försöker iterera över alla värden i ett enum och tilldela varje värde till ett nytt enum. Det här är vad jag kom fram till....

enum Color {
    Red, Green
}

enum Suit { 
    Diamonds, 
    Hearts, 
    Clubs, 
    Spades 
}

class Deck 
{
    cards: Card[];

    public fillDeck() {
        for (let suit in Suit) {
            var mySuit: Suit = Suit[suit];
            var myValue = 'Green';
            var color : Color = Color[myValue];
        }
    }
}

Delen var mySuit: Suit=Suit[suit]; kompileras inte och ger felet Type 'string' is not assignable to type 'Suit'.

Om jag hovrar över suit i for-loopen visar det mig let suit: string. var color : Color=Color[myValue]; kompilerar också utan fel. Vad gör jag fel här då båda exemplen med Suit och Color ser identiska ut för mig.

Jag använder TypeScript version 2.9.2 och detta är innehållet i min tsconfig.json

{
    "compilerOptions": {
        "target": "es6",
        "module": "commonjs",
        "sourceMap": true
    }
}

Finns det ett bättre sätt att iterera över alla värden i en enum, samtidigt som enumtypen bevaras för varje iteration?

Tack,

Svar #1

För strängenum, om strict-flaggan är på, får vi type string can't be used to index type 'typeof Suit'. Så vi måste göra något liknande:

for (const suit in Suit) {
    const mySuit: Suit = Suit[suit as keyof typeof Suit];
}

Om du bara behöver string-värdet av det, då går det bra att använda suit direkt.

Svar #2

Du kan antingen använda detta hack:

const mySuit: Suit = Suit[suit] as any as Suit;

eller ändra Suit-enum till en strängenum och använd den så här:

enum Suit { 
    Diamonds = "Diamonds", 
    Hearts = "Hearts", 
    Clubs = "Clubs", 
    Spades = "Spades",
}

for (let suit in Suit) {
    const mySuit: Suit = Suit[suit] as Suit;
}

Relaterade artiklar