Реакция useState с типом перечисления создает строку вместо числа

Я использую типизированный вызов 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 привела к неправильному типу. Даже если вас защищает машинописный текст, от подобных вещей защититься сложно.

useState не проводит никаких внутренних кастингов. Учитывая ваше перечисление, направление фактически должно быть number (хотя в IDE оно будет отображаться как тип Direction. Вы уверены, что имеете в виду одну и ту же переменную direction? Где сказано, что direction является string?
moonstar-x 23.05.2024 22:02

Я попробовал написать typeof direction в пользовательский интерфейс, и он распечатал string.

Joshua Frank 23.05.2024 22:50
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
1
2
58
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Когда вы используете перечисления без значения, их значения по умолчанию равны числам, например

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.

Joshua Frank 23.05.2024 20:09

useState не манипулирует значением. Вы уверены, что никаких других манипуляций не производится?

Petros 23.05.2024 20:54

Кроме того, рассмотрите возможность предоставления более подробной информации, чтобы люди могли помочь, а не просто голосовать против попытки помочь вам с минимальной информацией! Ответ, данный выше, не является неправильным, он просто не решает вашу проблему, и это из-за плохого вопроса.

Petros 24.05.2024 08:50

Что еще было бы полезно знать? Обычно я стараюсь показывать как можно меньше кода, демонстрирующего проблему, чтобы избежать беспорядка.

Joshua Frank 24.05.2024 15:33

Вы говорите, что переменная direction — это string. Где это происходит? direction — это состояние типа Direction, так где оно было инициализировано как строка?

Petros 24.05.2024 15:58

Я обнаружил проблему: я использовал направление в качестве ключа в компоненте из стороннего компонента, который передал мне ключ в обратном вызове, и он преобразовал значение в строку, и передача этого ключа в setDirection вызвала ошибку. типа ошибся. Даже если вас защищает машинописный текст, от подобных вещей защититься сложно.

Joshua Frank 30.05.2024 18:55

Другие вопросы по теме