끝맛잇기 컴포넌트는 기존 React 강의에서 다뤄봤으므로 useCallback 타이핑에 대한 부분만 간략하게 살펴본다
WordRelay.tsx
import * as React from "react";
import { useState, useRef, useCallback } from "react";
const WordRelay = () => {
const [word, setWord] = useState("비키");
const [value, setValue] = useState("");
const [result, setResult] = useState("");
const inputRef = useRef<HTMLInputElement>(null);
// 1. useCallback에 타입추론하는 방법 1
const onSubmitForm = useCallback<(e: React.FormEvent) => void>(
(e) => {
e.preventDefault();
// 2. useRef.current에 대한 변수 선언
const input = inputRef.current;
if (word[word.length - 1] === value[0]) {
setResult("딩동댕!");
setWord(value);
setValue("");
} else {
setResult("땡!");
setValue("");
}
// 2. Element가 null이 아닌 시점을 분기로 처리하여 타입오류 개선
if (input) {
input.focus();
}
},
[word, value]
);
// 1. useCallback에 타입추론하는 방법 2
const onChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => setValue(e.currentTarget.value), []);
return (
<>
<div>{word}</div>
<form onSubmit={onSubmitForm}>
<label htmlFor="wordInput">글자를 입력하세요.</label>
<input id="wordInput" className="wordInput" ref={inputRef} onChange={onChange} value={value} />
<button>입력</button>
</form>
<div>{result}</div>
</>
);
};
export default WordRelay;
함수를 바깥으로 분리하거나 useCallback으로 감싸주면 매개변수 e의 타입추론이 방해받아 any로 추론되어버림. 이때는 기존의 타입을 직접 주입해줘야하는데 2가지 방식으로 줄 수 있다.
가. useCallback에 제네릭으로 타입을 부여하는 방법
useCallback<(<e: React.FormEvent>) ⇒ void>((e) ⇒ {}, []);
나. 매개변수에 직접 타입 부여하는 방법
useCallback((e: React.FormEvent<HTMLInputElement>) ⇒ {}, []);
함수의 매개변수에 제네릭 타입으로 타이핑하는 것은 코드 가독성에는 무지 안좋은 것 같다..
useRef에 대한 타입 에러처리, 이전 컴포넌트와 중복되는 개념이지만 한번 더 인지하고 넘어간다 !