여기에는 문자열이 타입 인수로 전달되고 런타임 인수로 null
이 전달되는 useRef
hook이 있는 컴포넌트가 있습니다.
export const Component = () => {
const ref = useRef<string>(null);
// Why is this not allowed?
ref.current = "Hello";
return null;
};
그러나 참조의 현재 속성이 읽기 전용으로 표시되어 있으므로 current
속성에 값을 할당하는 데 문제가 있습니다.
Cannot assign to 'current' because it is a read-only property.
여러분의 임무는 이 문제의 원인을 찾아낸 다음 코드 줄을 변경하여 ref를 변경 가능하게 만드는 것입니다.
타입 정의 내부에는 함수 오버로드처럼 작동하는 useRef
훅에 대한 여러 선언이 있습니다.
이들은 useRef
를 호출할 수 있는 다양한 방법이며, 전달한 내용에 따라 다른 것을 반환합니다.
첫 번째 오버로드에서는 초기값을 전달하면 해당 값이 포함된 MutableRefObject
를 반환합니다.
function useRef<T>(initialValue: T): MutableRefObject<T>;
다시 코드로 돌아가서 테스트 mutableRef
를 생성해 보겠습니다.
export const Component = () => {
const ref = useRef<string>(null);
const mutableRef = useRef<string>("123456")
mutableRef
에 마우스를 가져가면 React.MutableRefObject<string>
으로 타입지정 되어 있는 것을 볼 수 있습니다. VSCode에서 함수를 CMD + 클릭
하면 사용 중인 정확한 오버로드로 이동합니다.
이제 mutableRef
가 어떤 오버로드를 사용하는지 알았으니, null
을 전달한 useRef
를 CMD + 클릭
해 봅시다.
const ref = useRef<string>(null);
이 버전은 읽기 전용 RefObject를 반환하는 두 번째 오버로드에 해당합니다. 이것이 바로 오류가 발생하는 이유입니다!