๋ ํ์ ์คํฌ๋ฆฝํธ์ ๊ธฐ๋ณธ ๊ฐ๋ ๋ถํฐ React์์ ํ์ฉํ๋ ๋ฐฉ๋ฒ๊น์ง ๊ณต๋ถํ๋ค. ์๋ฐ์คํฌ๋ฆฝํธ๋ง ์ฌ์ฉํ๋ค๊ฐ ํ์ ์คํฌ๋ฆฝํธ๋ก ๋์ด์ค๋ ์๋ก์ด ๊ฐ๋ ๋ค์ด ๋ง์๊ณ , ํนํ ํ์ ์์คํ ๊ณผ ์ ๋ค๋ฆญ, ์ ํธ๋ฆฌํฐ ํ์ ๋ฑ์ ๋ํ ์ดํด๊ฐ ํ์ํ๋ค...
ํ์ ์คํฌ๋ฆฝํธ๋ฅผ ์ดํดํ๊ธฐ ์ํด ๋จผ์ ๊ธฐ๋ณธ ๊ฐ๋ ๋ถํฐ ์ฐจ๊ทผ์ฐจ๊ทผ ์ ๊ทผํ๋ค. ์ ์ ํ์ ์์คํ ์ด๋ ๋ฌด์์ธ์ง, ์๋ฐ์คํฌ๋ฆฝํธ์์ ์ฐจ์ด์ ์ ๋ฌด์์ธ์ง, ๊ทธ๋ฆฌ๊ณ ๋ค์ํ ํ์ ์ ์ธ ๋ฐฉ๋ฒ๊ณผ ๊ณ ๊ธ ๊ธฐ๋ฅ๋ค์ ํ์ตํ๋ค. ์ค์ React ํ๋ก์ ํธ์ ์ ์ฉํด๋ณด๋ฉฐ ์ค๋ฌด์์ ์ด๋ป๊ฒ ํ์ฉ๋๋์ง ํ์ ํ๋ ๋ฐ ์ค์ ์ ๋์๋ค.
ํ์ ์คํฌ๋ฆฝํธ๋ ์๋ฐ์คํฌ๋ฆฝํธ์ ํ์ ์์คํ ์ ์ถ๊ฐํ ์ธ์ด๋ผ๊ณ ํ๋ค. ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ๋ฌ๋ฆฌ๋ ์ค์ ์ค๋ฅ๋ฅผ ๋ฐ๊ฒฌํ๋ "๋์ ํ์ ์ธ์ด"๋ผ๋ฉด, ํ์ ์คํฌ๋ฆฝํธ๋ ์ฝ๋ ์์ฑ ๋จ๊ณ์์ ์ค๋ฅ๋ฅผ ์ก์๋ด๋ "์ ์ ํ์ ์ธ์ด"๋ค.
์๋ฆฌ ๋ ์ํผ๋ก ๋น์ ํ๋ฉด, ์๋ฐ์คํฌ๋ฆฝํธ๋ ์ฌ๋ฃ์ ์์ ๋์ถฉ ๋ฃ๊ณ ๋ง์ ๋ณด๋ฉด์ ์๋ฆฌํ๋ ๋ฐฉ์์ด๊ณ , ํ์ ์คํฌ๋ฆฝํธ๋ ์ ํํ ์ฌ๋ฃ์ ์์ ๋ฏธ๋ฆฌ ์ ์ด๋๊ณ ๊ทธ๋๋ก ๋ฐ๋ผํ๋ ๋ฐฉ์์ด๋ผ๊ณ ๋ณผ ์ ์๋ค. ์ค์ํ ํ๋ฅ ์ด ํ์คํ ์ค์ด๋ ๋ค.
ํ์
์ ์ธ์ ์๊ฐ๋ณด๋ค ๊ฐ๋จํ๋ค. ๋ณ์๋ ํจ์ ์์ : ํ์
์ ๋ถ์ด๋ฉด ๋๋ค.
// ๊ธฐ๋ณธ ํ์
๋ค
let name: string = '์ฝ์ฝ';
let age: number = 11;
let isSmart: boolean = true;
let hobbies: string[] = ['๋๊ธฐ', '์๊ธฐ'];
// ๊ฐ์ฒด ํ์
let user: { name: string; age: number } = { name: '์ฝ์ฝ', age: 11 };
// ํจ์ ํ์
function greet(name: string): string {
return `์๋
, ${name}!`;
}
ํ์ ๊ณผ ์ธํฐํ์ด์ค ๋ ๋ค ํ์ ์ ์ ์ํ๋ ๋ฐฉ๋ฒ์ธ๋ฐ, ๋ฏธ๋ฌํ ์ฐจ์ด๊ฐ ์๋ค.
// type์ผ๋ก ์ ์
type User = {
name: string;
age: number;
};
// interface๋ก ์ ์
interface Person {
name: string;
age: number;
}
๋์ด ์ผํ ๋น์ทํด ๋ณด์ด์ง๋ง ์ฌ์ฉํ๋ค ๋ณด๋ ์ฐจ์ด์ ์ด ์์๋ค:
interface Person {
name: string;
}
interface Person {
age: number;
} // ์ด๋ฌ๋ฉด Person์ name๊ณผ age ๋ ๋ค ๊ฐ์ง ํ์
์ด ๋๋ค
type ID = string | number;
type Employee = Person & { employeeId: string };
๋ ์ค ์ด๋ ๊ฒ์ ์จ์ผ ํ ์ง ๊ณ ๋ฏผํ๋๋ฐ, ๋ฌธ์์์๋ "๋๋ถ๋ถ์ ๊ฒฝ์ฐ ๋ ๋ค ์ธ ์ ์๊ณ , ํ์ฅ ๊ฐ๋ฅ์ฑ์ด ์์ผ๋ฉด ์ธํฐํ์ด์ค๋ฅผ, ๋ณต์กํ ํ์ ํํ์ด ํ์ํ๋ฉด ํ์ ์ ์ฐ๋ผ"๊ณ ํ๋ค. ์ผ๋จ์ ํ์ ๋ถํฐ ์ต์ํด์ง๋ ๊ฑธ๋ก...
์ ๋ค๋ฆญ์ด๋ ๊ฐ๋ ์ด ์ฒ์์๋ ์ข ์ด๋ ค์ ๋ค. ํ์ ์ ๋ณ์์ฒ๋ผ ์ฌ์ฉํ๋ค๋ ๊ฑด๋ฐ...
function getFirstItem<T>(items: T[]): T | undefined {
return items[0];
}
const numberItem = getFirstItem([1, 2, 3]); // numberItem: number
const stringItem = getFirstItem(['a', 'b', 'c']); // stringItem: string
์ด๋ฐ ์์ผ๋ก T ์๋ฆฌ์ ์ค์ ์ฌ์ฉํ ํ์ ์ด ๋ค์ด๊ฐ๋ค. React์ useState์์๋ ๊ฐ์ ํํ๋ก ๋์ด:
const [users, setUsers] = useState<User[]>([]);
์ฒ์์๋ ""๊ฐ ๋ญ์ง? ์ถ์๋๋ฐ, "์ด๋ค ํ์ ์ด๋ ๋ค์ด์ฌ ์ ์๋ ์๋ฆฌ"๋ผ๊ณ ์๊ฐํ๋ ์ข ์ดํด๊ฐ ๋๋ค.
ํ์ ์คํฌ๋ฆฝํธ์๋ ๊ธฐ์กด ํ์ ์ ๋ณํํด์ ์ ํ์ ์ ๋ง๋๋ ์ ํธ๋ฆฌํฐ ํ์ ์ด๋ผ๋ ๊ฒ๋ ์๋ค. ์ด ๋ถ๋ถ์ด ํนํ ์ ์ฉํ๋ค.
type Todo = {
id: string;
title: string;
completed: boolean;
};
// id์ completed๋ง ์ ํ
type ToggleTodo = Pick<Todo, 'id' | 'completed'>;
// title์ ์ ์ธํ ๋๋จธ์ง ์์ฑ
type TodoWithoutTitle = Omit<Todo, 'title'>;
// ๋ชจ๋ ์์ฑ์ ์ ํ์ ์ผ๋ก
type PartialTodo = Partial<Todo>;
์ด๋ ๊ฒ ํ๋ฉด ๊ธฐ์กด ํ์ ์์ ํ์ํ ๋ถ๋ถ๋ง ์ ํํ๊ฑฐ๋ ์ผ๋ถ๋ฅผ ์ ์ธํ ์ ํ์ ์ ๋ง๋ค ์ ์์ด์ ์ฝ๋ ์ฌ์ฌ์ฉ์ฑ์ด ๋์์ง๋ค.
์ค๋ ๋ฐฐ์ด ๊ฑธ ํ ๋๋ก ๊ฐ๋จํ Todo ์ฑ์ ๋ง๋ค์ด๋ดค๋ค.
type Todo = {
id: string;
title: string;
completed: boolean;
};
type ToggleTodo = Omit<Todo, 'title'>;
function TodoItem({
id,
title,
completed,
onDeleteClick,
onToggleClick,
}: Todo & {
onDeleteClick: (id: string) => void;
onToggleClick: (todo: ToggleTodo) => void;
}) {
return (
<div>
<span
onClick={() => onToggleClick({ id, completed })}
style={{ textDecoration: completed ? 'line-through' : 'none' }}
>
{title}
</span>
<button onClick={() => onDeleteClick(id)}>์ญ์ </button>
</div>
);
}
React์ ํ์ ์คํฌ๋ฆฝํธ๋ฅผ ๊ฐ์ด ์ฐ๋ props์ ํ์ ์ ๋ช ํํ๊ฒ ์ ์ ์์ด์ ์ข์๋ค. ํนํ ์ด๋ฒคํธ ํธ๋ค๋ฌ ํจ์์ ๋งค๊ฐ๋ณ์ ํ์ ์ ์ง์ ํ๋ ์ค์๋ก ์๋ชป๋ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ ์ผ์ด ์์ด์ก๋ค.
์์ง ์ด๋ณด์ง๋ง ํ์ ์คํฌ๋ฆฝํธ๊ฐ ์ ์์ฆ ํ์ ๊ธฐ์ ์ด ๋๋์ง ์กฐ๊ธ์ฉ ์ดํด๊ฐ ๊ฐ๋ค. ๋ด์ผ์ React์ ๊ฝ์ธ Next๋ฅผ ๊ณต๋ถํด๋ด์ผ๊ฒ ๋ค...!!