- Published on
๐ ์ปฌ๋ฌ๋ฆฌ์คํธ ํ๋ก์ ํธ #21 Input Component ์ถ์ถํ๊ธฐ
- ๊ธ์ด์ด
๐
์ด์ ์ VerticalForm
์ฌ์ด์ children
์ผ๋ก ๋ค์ด์๋ Input
๋ค์ component
๋ก ์ถ์ถํด
์ข ๋ ์ฌํํ Register.tsx, Login.tsx
๋ฅผ ๋ง๋ค์ด๋ณด๊ณ ์ ํ๋ค.
์ด์ ์ ์ฝ๋๋ ์๋์ ๊ฐ์ ๋ชจ์์ด์๋ค.
๊ฐ๊ฐ์ input
๋ง๋ค label
๊ณผ span
, className
์ ๋ชจ๋ ๋ฐ๋ก ์ง์ ํด์ฃผ์ด์ผํ๋ค.
;<label className="flex flex-col gap-2">
<span className="text-xl">์ด๋ฉ์ผ</span>
<input
type="email"
className="input input-bordered"
{...register('email', {
required: '์ด๋ฉ์ผ์ ์
๋ ฅํด์ฃผ์ธ์!',
})}
/>
</label>
{
errors.email && <li role="alert">{errors.email.message}</li>
}
;<label className="flex flex-col gap-2">
<span className="text-xl">๋น๋ฐ๋ฒํธ</span>
<input
type="password"
className="input input-bordered"
{...register('password', {
required: '๋น๋ฐ๋ฒํธ๋ฅผ ์
๋ ฅํด์ฃผ์ธ์!',
})}
/>
</label>
{
errors.password && <li role="alert">{errors.password.message}</li>
}
์ด ๋ถ๋ถ์ ๋นผ์ Input.tsx
์ ๋ฐ๋ก ์ปดํฌ๋ํธ๋ฅผ ์ถ์ถํ๋ค.
์ผ๋จ DataT๋ผ๋ ํ์
์ ํ์ฌ ์กด์ฌํ๋ ๋ ๊ฐ์ input type
์ธ email
๊ณผ password
์ type
์ ์ค์ ํ๋ค.
์ฐธ๊ณ : https://www.typescriptlang.org/docs/handbook/2/objects.html
type DataT = {
email: string
password: string
}
์ด๋ ๊ฒ ํ๋ฉด ์ด๋ฉ์ผ๊ณผ ๋น๋ฐ๋ฒํธ์ ๋ฌธ์์ด์ ๋ฃ์์ ๋๋ง ์๋ฌ๊ฐ ๋จ์ง ์๋๋ค.
let a: DataT = {
email: 'test@naver.com',
password: 'test',
}
๊ทธ๋ฆฌ๊ณ DataKey
๋ผ๋ ํ์
์ ์ค์ ํด DataT
์ ์๋ ํค๋ค์ ํ์
์ผ๋ก ์ค์ ํ๋ค.
์ฐธ๊ณ : https://www.typescriptlang.org/docs/handbook/2/keyof-types.html
type DataKeys = keyof DataT // 'email' | 'password' ์ด ๋๊ฐ๋ง ํ์
์ผ๋ก ์ฌ ์ ์๋ค.
function hello(name: DataKeys) {
console.log(name)
}
hello('email')
hello('password')
// hello("test"); // <- ํ์
์๋ฌ!
๊ทธ ๋ค์์ ์๋ฌ๊ฐ ๋ฌ์๋ ์ฌ ์ ์๋ ๋ฐ์ดํฐ๋ฅผ ์ค์ ํด์ค๋ค.
type ErrorData = {
[key in keyof DataT]: { message?: string }
//์์๋ email์ด๋ password๋ง ์ฌ ์ ์๊ณ :๋ค์๋ ๋ฉ์์ง๊ฐ ์ฌ ์๋, ์ ์ฌ ์๋ ์๋๋ฐ, ์ค๋ฉด ๋ฌธ์์ด์ด์ด์ผ ํ๋ค.
}
์์์ ๋ง๋ ์๋ฌ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ์๋ฌ๊ฐ ๋ฌ์๋ ์ฝ์์ ์๋ฌ๋ฉ์์ง๋ฅผ ์ฐ์ด์ฃผ๋ ํจ์๋ฅผ ๋ง๋ค์๋ค.
function logError(errors: ErrorData) {
console.error(errors)
}
// {
// email: {
// message: string;
// };
// password: {
// message: string;
// };
// }
// logError({
// email: "test@naver.com",
// password: "test",
// }); // ๋ค๋ฅธ ํ์
!
// ๊ฐ์ฒด๋ก ์์ผํด~~
logError({
email: { message: 'test@naver.com' },
password: {}, // message๋ optional ? ์ด๋๊น
})
ํ์ง๋ง ์์ ๊ฒฝ์ฐ๋ ๋ฌด์กฐ๊ฑด ๋๊ฐ์ ํค๊ฐ ๋ค ์
๋ ฅ๋์ด์ผํ๋ค.
ํ๋๋ง ์
๋ ฅํ์๋๋ ์๋ฌ ๋ฉ์์ง๊ฐ ๋จ๊ฒ ํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผํ ๊น?
์ด๋ Partial type
์ ์ด์ฉํด์ ํด๊ฒฐํ ์ ์๋ค.
Partial
์ ๋ถ๋ถ์งํฉ๊ฐ์ ๊ฐ๋
์ผ๋ก, logError
์์ ์๋ ๋ชจ๋ ์ ๋ณด๊ฐ ์๋ ๋๊ณ , ์ผ๋ถ๋ง ์๋ ๋๋ค.
์ฐธ๊ณ : https://www.typescriptlang.org/docs/handbook/utility-types.html#partialtype
type PartialE = Partial<ErrorData>
// {
// email?: {
// message: string;
// } | undefined;
// password?: {
// message: string;
// } | undefined;
// }
์ด๋ ๊ฒ PartialE
๋ผ๋ ํ์
์ ์ ํ๊ณ
์๋ก์ด logError2
ํจ์๋ฅผ ๋ง๋ค๋ฉด email
,password
๋ ์ค์ ํ๋๋ง ์
๋ ฅํ์ง ์์๋ ์๋ฌ๋ฉ์์ง๊ฐ ๋ฌ๋ค.
function logError2(errors: PartialE, name: keyof DataT) {
console.error(errors[name])
}
// logError2({}, "test");
logError2(
{
email: { message: 'ํ์ ์
๋ ฅ์
๋๋ค!' },
},
'email'
)
logError2(
{
password: { message: 'ํ์ ์
๋ ฅ์
๋๋ค!' },
},
'password'
)