TS + React + Recoil 환경의 개발을 진행하던 중, 기본적인 문제에 부딪혀 한번 짚고넘어가기 위해 글을 작성한다.
//recoil state 생성
export interface UserTypes {
memberName: string;
memberPhone: string;
memberPassword: string;
}
export const userState = atom<UserTypes>({
key: "user",
default: {
memberName: "",
memberPhone: "",
memberPassword: "",
},
});
const onChange = (e: React.ChangeEvent<HTMLInputElement>) => {
const {
target: { name, value },
} = e;
// 비밀번호
if (name === "password") {
setMemberPassword((prevUser) => ({
...prevUser,
memberPassword: value,
}));
}
// 비밀번호 확인
if (name === "password_confirm") {
setMemberPasswordConfirm(value);
if (value?.length < 8) {
setError("비밀번호는 8자리 이상으로 입력해주세요.");
} else if (value !== memberPassword) {
setError("비밀번호가 일치하지 않습니다.");
} else {
setError("");
}
}
};
여기서 문제가 발생한 부분은 바로 memberPasswordConfirm가 memberPassword와 일치하는지 확인하는 부분이다.
value !== memberPassword
//Error: 'string'이(가) 'UserTypes'과(와) 겹치지 않으므로 이 비교는 의도하지 않은 것 같습니다.`
💥오류내용: 사용자가 회원가입하기 위해 입력하는
value
값은string
타입인데,memberPassword
는UserTypes
타입으로 인식하기 때문에 두 값의 타입이 맞지 않아 비교할 수 없음을 의미한다.
✅해결방법:
memberPassword
로 되어있는 부분을,memberPassword.memberPassword
로 수정해주면 된다.
memberPassword
: UserTypes의 객체 전체를 의미memberPassword.memberPassword
: UserTypes 객체에서 memberPassword 필드에 해당하는 값을 의미 (실제 password 값)
정확히 확인해보기 위해 콘솔값을 띄워보았다.
if (name === "password") {
setMemberPassword((prevUser) => ({
...prevUser,
memberPassword: value,
}));
console.log(memberPassword); // 콘솔확인
}
만약 memberPassword
변수가 memberPassword
의 값만을 나타낸다면, 콘솔엔 비밀번호값만 떠야 맞지만, 객체를 나타낸다면, memberName
과 memberPhone
값을 나타낼것이다.
👀Console 확인
memberPassword
확인 -> 객체 전체의 값이 나타남
memberPassword.memberPassword
확인 -> password값만 나타남