티스토리 뷰
hook
useInput.ts
- 제네릭 타입으로 확장
- 키에는 영향을 안 주고 값에만 확장이 가능함
- 애초에 인터페이스 값이 언노운이면 의미 없음
import { ChangeEvent, useCallback, useState } from "react";
interface initialFormType {
[key: string]: unknown;
}
// 하지만 이미 값이 unknown(모든 타입 허용)인 경우, 아래처럼 제네릭타입으로 확장해주지않아도된다.
const useInput = <T extends initialFormType>(initialForm: T) => {
// <T extends initialFormType> = initialFormType 타입을 제네릭 타입으로 확장한다
// (타입이 확정된게 아닌, unknown처럼 다른 타입을 넣을 수 있다)
// 제네릭 타입 확장은 값에만 영향을 주기 때문에 키는 동일하게 string으로 유지된다
const [form, setForm] = useState<T>(initialForm);
const onChange = useCallback(
(
e:
| ChangeEvent<HTMLInputElement>
| ChangeEvent<HTMLSelectElement>
| ChangeEvent<HTMLTextAreaElement>
) => {
const { name, value } = e.target;
setForm((preForm) => ({ ...preForm, [name]: value }));
},
[]
);
const reset = useCallback(() => setForm(initialForm), [initialForm]);
return { form, setForm, onChange, reset };
// 원래는 배열로 감싸 리턴했지만, 반환하는 값의 관계를 명확하게 하고자 객체 리턴
};
export default useInput;
커스텀 인풋 사용 시 객체 리턴이기 때문에 아래와 같이 사용하면 됨
const {
form: todoInput,
setForm: setTodoInput,
onChange,
reset,
} = useInput(init);
'TIL > 최종프로젝트' 카테고리의 다른 글
[최종프로젝트] 유틸타입 (Utill Type) (0) | 2024.04.05 |
---|---|
[최종프로젝트] 수파베이스 조인 (Join) (0) | 2024.04.02 |
[최종프로젝트] 수파베이스 타입다운로드 (0) | 2024.04.02 |
[최종프로젝트] 기획중_리액트 퀼 (React-Quill) (0) | 2024.03.28 |
[최종프로젝트] 기획중_단언 연산자 !_타입좁히기_옵셔널파라미터 ? (0) | 2024.03.27 |