Я использую типизированный вызов useState для установки переменной состояния типа перечисления:
enum Direction
{
None,
North,
South,
East,
West
}
const [direction, setDirection] = useState<Direction>(Direction.None)
Это работает и правильно набирается в машинописном тексте (я имею в виду в IDE), но фактический тип переменной направления — string, и это не работает в таких конструкциях, как
var label: direction === Direction.None ? "Select a direction..." : direction.toString(),
потому что переменная direction — это строка, а Direction.None — число.
Вместо этого я мог бы использовать ==, но предпочел бы этого не делать, потому что весь смысл строгой типизации в том, что вы не полагаетесь на такое поведение.
Есть ли способ заставить useState действительно возвращать переменную состояния перечисления правильного типа?
Обновлять:
Действительно, useState правильно сохраняет тип данных, который вы передаете, но я нашел источник проблемы: я использовал направление в качестве ключа в компоненте из стороннего компонента, который передал мне ключ в обратном вызове, и он преобразовал значение в строку, и передача этого ключа в setDirection привела к неправильному типу. Даже если вас защищает машинописный текст, от подобных вещей защититься сложно.
Я попробовал написать typeof direction в пользовательский интерфейс, и он распечатал string.





Когда вы используете перечисления без значения, их значения по умолчанию равны числам, например
enum Direction
{
None, // = 0
North, // = 1
South, // = 2
East, // = 3
West // = 4
}
Чтобы использовать перечисление со строковыми значениями, все, что вам нужно сделать, это присвоить перечислениям нужные строковые значения. Нравиться:
enum Direction
{
None=“None”,
North=“North”,
South=“South”,
East=“East”,
West=“West”
}
Отредактировано: Вы можете посмотреть этот фрагмент и узнать, как он ведет себя, с подробностями, которые вы предоставили. https://playcode.io/1882531
Мне нужны числовые значения. Проблема в том, что useState, кажется, устанавливает переменную direction в строку «0», а не в число 0.
useState не манипулирует значением. Вы уверены, что никаких других манипуляций не производится?
Кроме того, рассмотрите возможность предоставления более подробной информации, чтобы люди могли помочь, а не просто голосовать против попытки помочь вам с минимальной информацией! Ответ, данный выше, не является неправильным, он просто не решает вашу проблему, и это из-за плохого вопроса.
Что еще было бы полезно знать? Обычно я стараюсь показывать как можно меньше кода, демонстрирующего проблему, чтобы избежать беспорядка.
Вы говорите, что переменная direction — это string. Где это происходит? direction — это состояние типа Direction, так где оно было инициализировано как строка?
Я обнаружил проблему: я использовал направление в качестве ключа в компоненте из стороннего компонента, который передал мне ключ в обратном вызове, и он преобразовал значение в строку, и передача этого ключа в setDirection вызвала ошибку. типа ошибся. Даже если вас защищает машинописный текст, от подобных вещей защититься сложно.
useStateне проводит никаких внутренних кастингов. Учитывая ваше перечисление, направление фактически должно бытьnumber(хотя в IDE оно будет отображаться как типDirection. Вы уверены, что имеете в виду одну и ту же переменнуюdirection? Где сказано, чтоdirectionявляетсяstring?