Использование перечисления внутри членов со строковым значением - PullRequest
2 голосов
/ 07 мая 2020

Предполагая, что это мои перечисления:

enum Direction {
    Up = `1`,
    Down = '2',
    Left = '3',
    Right = '4',
}

enum Direction2 {
    Up = Direction.Up
}

Приведенный выше случай действителен до тех пор, пока значение 2-го перечисления взято из другого перечисления. Но почему это неверно?

enum Direction2 {
    Up = Direction.Up,
    Down = '2'
}

Я просмотрел typescript enum do c, но не могу найти для этого никаких причин. Из того, что я вижу, оба значения в Direction2 являются строкой, и они должны быть разрешены. Я знаю, что это можно обойти, если я изменю Direction2 на json:

let Direction2 = {
    Up: Direction.Up,
    Down: '2'
}

, но я бы предпочел сохранить его как перечисление.

1 Ответ

0 голосов
/ 07 мая 2020

Ваш синтаксис должен выдавать ошибку:

Вычисляемые значения не разрешены в перечислении с элементами со строковыми значениями.

От ведущего разработчика Typescript это запрещено намеренно. :

Перечисления строк синтаксически отличаются от перечислений numeri c тем, что строковые литералы присутствуют во всех позициях инициализации. Это также тот случай, когда нам нужно создать тип объединения (вместо фирменного примитивного типа) для перечисления строкового литерала, который на самом деле не получается из констант без явных аннотаций типов.

https://github.com/Microsoft/TypeScript/issues/20440

Итак, проблема, с которой вы столкнулись, не связана с ссылками на объявления Enum в других перечислениях. Просто другие значения перечисления являются строковыми значениями. См. Следующее:

// valid
enum Test{
    A = 1,
    B = 2
}
enum AnotherTest{
    A = Test.B,
    B = 2
}
/////////////////////////////
// valid
enum Test{
    A = "1",
    B = "2"
}
enum AnotherTest{
    A = Test.B,
    B = 2
}
/////////////////////////////
// INVALID
enum Test{
    A = "1",
    B = "2"
}
enum AnotherTest{
    A = Test.B,
    B = "2"
}
...