Невозможно присвоить строковое значение перечислению машинописного текста (строка типа инициализатора не может быть присвоена переменному типу) - PullRequest
0 голосов
/ 22 мая 2018

Кажется, что начиная с TypeScript 2.4 и далее Строковые перечисления являются функцией.

Однако следующее не работает:

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

var foo : Foo = "A";

Строка типа инициализаторанельзя присвоить типу переменной Foo

Строковые литералы работают:

type Foo = "A" | "B";

Но что, если я захочу использовать enum?Есть ли способ обойти это?

Ответы [ 4 ]

0 голосов
/ 22 мая 2018

Поскольку Foo - это перечисление, поэтому вы также можете использовать . для доступа к значению enum, как показано ниже

var foo : Foo = Foo.A;
0 голосов
/ 22 мая 2018

Как описано в машинописной документации enum документации

, вы можете использовать ее по-разному:

Enum.A // Good way

Enum["A"] // Bad way

Enum[variable] // Good way

В вашем случае

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

Вы должны ИЗБЕГАТЬ использовать example1 и сосредоточиться на example2 и example3.В любом случае, нет смысла писать "A".

Всегда предпочитайте Enum.A, и если вы хотите привести переменную в качестве перечисления, используйте Enum[variable].

0 голосов
/ 22 мая 2018

Хотя это и не прямой ответ на вопрос как таковой (поскольку он присваивает не enum, а производный тип), я обнаружил, что это решает мою проблему, позволяющую мне присвоить string и гарантирует, что это является частью перечисления, и даже позволяет мне избежать лишнего A = "A", когда все, что действительно имеет значение, это A.

Вы можете использовать keyof [1] для перечисления свойств в typeof перечислении (Foo)

enum Foo {
    A,
    B
}

var foo : keyof typeof Foo = "A"; // OK
var foo : keyof typeof Foo = "C"; // ERROR

Или для объектов:

interface Bar {
    type: keyof typeof Foo
}

let obj: Bar = {
    type: "A" // OK
}

[*] Я будупометьте один из других ответов как принятый и сохраните его здесь для справки

0 голосов
/ 22 мая 2018

Вы можете использовать индексное выражение для получения значения перечисления:

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

var foo : Foo = Foo["A"];
var fooB : Foo = Foo["B"];

Обратите внимание, что ключом будет имя члена, а не значение.

Вы также можетеиспользуйте утверждение типа, но вы не получите ошибок, если назначите неправильное значение:

var foo : Foo = "A"  as Foo;
var foo : Foo = "D"  as Foo; // No error
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...