无法为typescript enum分配字符串值(初始化器类型字符串不能分配给变量类型)

ᴘᴀɴ*_*ᴛɪs 5 enums typescript

似乎从TypeScript 2.4开始,String Enums 是一个功能.

但是以下不起作用:

enum Foo {
    A = "A",
    B = "B"
}

var foo : Foo = "A";
Run Code Online (Sandbox Code Playgroud)

初始化程序类型字符串不能分配给变量类型Foo

字符串文字工作:

type Foo = "A" | "B";
Run Code Online (Sandbox Code Playgroud)

但是,如果我使用一个enum怎么办?有没有解决的办法?

Tit*_*mir 8

您可以使用索引表达式来获取枚举的值:

enum Foo {
    A = "A",
    B = "BB"
}

var foo : Foo = Foo["A"];
var fooB : Foo = Foo["B"];
Run Code Online (Sandbox Code Playgroud)

请注意,键将是成员的名称而不是值。

您也可以使用类型断言,但如果您分配了错误的值,则不会出错:

var foo : Foo = "A"  as Foo;
var foo : Foo = "D"  as Foo; // No error
Run Code Online (Sandbox Code Playgroud)


ᴘᴀɴ*_*ᴛɪs 8

虽然不是问题本身的直接答案(因为它不分配给枚举而是派生类型),但我发现这确实解决了允许我分配 astring并保证它是枚举的一部分的问题,并且A = "A"当真正重要的是时,甚至可以让我避免多余的事情A

您可以使用keyof [1]typeof枚举enum ( Foo)上的属性

enum Foo {
    A,
    B
}

var foo : keyof typeof Foo = "A"; // OK
var foo : keyof typeof Foo = "C"; // ERROR
Run Code Online (Sandbox Code Playgroud)

或者在物体上:

interface Bar {
    type: keyof typeof Foo
}

let obj: Bar = {
    type: "A" // OK
}
Run Code Online (Sandbox Code Playgroud)

[*] 我会将其他答案之一标记为已接受,并将其保留在此处以供参考


Gré*_*EUT 5

如打字稿枚举文档中所述

你可以用不同的方式使用它:

Enum.A // Good way

Enum["A"] // Bad way

Enum[variable] // Good way
Run Code Online (Sandbox Code Playgroud)

在你的情况下

enum Foo {
    A = "A",
    B = "B"
}

// Bad way
const example1 : Foo = Foo["A"];

// Good way
const example2 : Foo = Foo.A;

// Good way
const example3 : Foo = Foo[variable];
Run Code Online (Sandbox Code Playgroud)

你应该避免使用example1和关注example2example3。无论如何,写"A".

总是更喜欢Enum.A,如果您想将变量转换为枚举,请使用Enum[variable].


Pra*_*mar 5

由于Foo是枚举,所以你可以使用.,以及对accesss的价值enum像下面

var foo : Foo = Foo.A;
Run Code Online (Sandbox Code Playgroud)