[React] MutableRefObject와 LegacyRef
[React] MutableRefObject와 LegacyRef
출처: https://zerodice0.tistory.com/244
[React] MutableRefObject와 LegacyRef
Input의 onChange에 setState를 할당해서 값이 바뀔때마다 상태값이 변경되도록 설정했더니, 매번 Input에 입력한 값이 변경될 때마다 렌더링이 다시 되는 기염을 토했다. 당연한 얘긴 줄 알고 있었는데
zerodice0.tistory.com
우선 Input
의 ref
를 보면 요 녀석은 LegacyRef|undefined
를 받게 되어있다. 요 녀석을 따라가보자.

Input
이 어째서 LegacyRef
를 참조하는지는 IntrinsicElement
를 살펴보면 알 수 있다. IntrinsicElement
는 Dom elements
에다, React
내에서 추가한 props
를 처리할 수 있도록 만들어놓은 녀석인 듯(?)하다. 요 녀석부터 살펴보자.
useRef
가 반환하는 녀석을 보면 MutableRefObject<HTMLInputElement | undefined>
를 반환하는 걸 볼 수 있다. 뭐, T
를 HTMLInputElement
로 주고 초기값이 undefined
니까 자연스럽게 T
가 HTMLInputElement|undefined
로 추론되는 것.
문제는 ref
의 T
가 IntrinsicElements
의 DetailedHTMLProps
에 의해서 HTMLInputElement
로 고정됐는데, useRef
의 반환형은 초기값이 undefined
이므로 T
가 HTMLInputElement | undefined
로 고정된다. 결국 여기서 T
가 다르기때문에, ref
에 내려꽂으면 에러가 발생하는 것!
이제 useRef<HTMLInputElement>()
를 useRef<HTMLInputElement>(null)
로 변경하면 무슨 일이 일어나는지 살펴보자.

useRef
의 반환형이 RefObject<HTMLInputElement>
로 바뀌었다! 위에서 살펴봤던 세 가지 형태의 useRef
에서, T
값이 변경되어 반환형도 달라졌기 때문이다.
function useRef<T>(initialValue: T): MutableRefObject<T>;
function useRef<T>(initialValue: T|null): RefObject<T>;
function useRef<T = undefined>(): MutableRefObject<T | undefined>;
이제 할당하고자 하는 ref
의 타입과 useRef
의 반환형이 동일하므로, 에러가 발생하지 않게됐다. 와! 고민 해결!
출처: https://zerodice0.tistory.com/244 [검은곰의 아카이브:티스토리]