用打字稿遍历一个枚举并分配给一个枚举

时间:2018-07-11 08:21:41

标签: typescript enums

我试图遍历枚举中的所有值,并将每个值分配给一个新的枚举。这就是我想出的。...

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

部分var mySuit: Suit = Suit[suit];无法编译,并返回错误Type 'string' is not assignable to type 'Suit'

如果我将鼠标悬停在for循环中的suit上,则会显示let suit: stringvar color : Color = Color[myValue];也会正确编译。我在这里做错了什么,因为“西装”和“颜色”的两个示例都与我相同。

我使用的是TypeScript 2.9.2版,这是我的tsconfig.json的内容

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

是否有更好的方法来遍历枚举中的所有值,同时保持每次迭代的枚举类型?

谢谢

2 个答案:

答案 0 :(得分:3)

您可以使用此技巧:

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

或将Suit枚举更改为字符串枚举并按如下方式使用它:

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

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

答案 1 :(得分:2)

对于字符串枚举,如果打开strict标志,我们将得到type string can't be used to index type 'typeof Suit'。 所以我们必须像这样:

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

如果只需要它的string值,那么直接使用suit就可以了。