@Boris007

Почему в типе ChangeEvent не находит свойство checked?

Почему, когда мы указываем такой тип он выдает ошибку
ChangeEvent<HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement>

А при ChangeEvent<HTMLInputElement> работает

function handleChange(event: ChangeEvent<HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement>) {
    const { name } = event.target
    const value = event.target.checked
    setData(data => ({...data, [name]: value}))
  }


Property 'checked' does not exist on type 'EventTarget & (HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement)'.
Property 'checked' does not exist on type 'EventTarget & HTMLSelectElement'


По логике мы же говорим, что или, или у нас тип.
В какой момент и по какой логике TS начинает считать это ошибкой?

Почему это условие убирает ошибку?
if(event.target instanceof HTMLInputElement) value = event.target.checked

Ведь это всего лишь условие, а не заданный тип в аргументе нашему event
  • Вопрос задан
  • 113 просмотров
Решения вопроса 1
Alexandroppolus
@Alexandroppolus
кодир
Всё довольно просто.

1) Если у тебя есть типы A, B, C, D, то тип A & (B | C | D) сразу превращается в (A & B) | (A & C) | (A & D) = X | Y | Z

2) для объекта с типом X | Y | Z ты можешь обратиться к свойству checked, только если оно есть во всех троих типах. Надо объяснять почему?

3) instanceof в данном конкретном случае сужает тип X | Y | Z до X, в котором это свойство есть, и отбрасывая типы, где его нет.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы