Почему useState<string>() не является ошибкой TypeScript?

Хорошо:

const [foo, setFoo] = useState<string>()

Это не:

const [boo, setBoo] = useState<string>(undefined)

Аргумент типа «неопределенный» не может быть присвоен параметру типа «строка | (() => строка)'

Я думаю, что они имеют то же значение, хотя - useState без аргументов то же самое, что и useState(undefined).

Просто TypeScript по какой-то причине не может это обнаружить?

Поскольку формы без аргументов и формы с одним аргументом различаются, их начальное значение undefined не имеет значения: github.com/DefinitelyTyped/DefinitelyTyped/blob/…

jonrsharpe 26.07.2023 09:02

const [foo, setFoo] = useState<string>(" ");

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

Ответы 2

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

Потому что определение DefinitelyTyped перегружено 2 сигнатурами для useState, одна из которых не имеет аргументов:

// with argument
function useState<S>(initialState: S | (() => S)): [S, Dispatch<SetStateAction<S>>];
// no argument
function useState<S = undefined>(): [S | undefined, Dispatch<SetStateAction<S | undefined>>];

Если вы хотите, чтобы определение аргумента допускало undefined, вам нужно явно определить его следующим образом:

const [boo, setBoo] = useState<string|undefined>(undefined)

useState<string>() — это условное сокращение для useState<string|undefined>(undefined)

Типография здесь

function useState<S>(initialState: S | (() => S)): [S, Dispatch<SetStateAction<S>>];
// convenience overload when first argument is omitted
// ...
function useState<S = undefined>(): [S | undefined, Dispatch<SetStateAction<S | undefined>>];

Как указано в комментарии к коду, это просто удобство, а не упущение, а намеренно.

Не используйте это, ваше состояние должно строго быть string, так как отсутствие аргумента делает undefined также разрешенным.

Побочный момент: это также позволяет useState() без аргумента или аргумента типа, что приводит к объекту состояния, который может быть только undefined

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