
์ค๋ฅธ์ชฝ์ฒ๋ผ ๊ทธ๋ฅ ํจ์๋ฅผ ์ฐ๋ฉด ๋๋๊ฑด๋ฐ ์ ํ์ ์คํฌ๋ฆฝํธ์์๋ ์ ํ์ ์ง์ Interface๋ฅผ ๋ง๋ค๊ณ ํจ์์ ํ์ ์ ์ง์ ํด์ฃผ๋ ๊ฑธ๊น?
=> react์์ props๋ก ํจ์๋ฅผ ๋๊ฒจ์ค ๋ ๋ง์ด ์ฌ์ฉ๋๋ ๋ฐฉ์์ด๋ค.
๋ถ๋ชจ ์์๊ฐ์ ์ปดํฌ๋ํธ๋ก props๋ก ๋ฐ์ดํฐ๊ฐ ๋์ด๊ฐ ๋ ์๊ธฐ๋ ํ์ ์ค๋ฅ๋ฅผ ์ฌ์ ์ ๋ง์์ค๋ค.
1. ๊ฐ์ ํ์ ์ ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ๋ ํจ์๊ฐ ์ฌ๋ฌ๊ฐ์ผ ๋ ๋งค๊ฐ๋ณ์ ํ์ ์ ์์ ์ด๋๋๋ค.
// [๋ฐฉ์ A] ํ์
์ ์ง์ ํ์ง ์์ ๊ฒฝ์ฐ: ๋งค๋ฒ ํ์
์ ์ ์ด์ผ ํจ (๊ท์ฐฎ์)
const add = (x: number, y: number) => x + y;
const sub = (x: number, y: number) => x - y;
// [๋ฐฉ์ B] ํ์
์ ๋ฏธ๋ฆฌ ์ง์ ํ ๊ฒฝ์ฐ: ๊ตฌํํ ๋ ๊น๋ํจ!
interface MathFunc {
(x: number, y: number): number;
}
const add: MathFunc = (x, y) => x + y; // x, y๊ฐ number๋ผ๊ณ ์๋์ผ๋ก ์์!
const sub: MathFunc = (x, y) => x - y;
2. ๋์ผํ ํ์์ ํจ์๋ฅผ ๊ท๊ฒฉํํ ๋ ์ผ๊ด์ฑ์ ๋ถ์ฌํ๋ค.
์๋ฅผ๋ค์ด ๋ชจ๋ ๊ณ์ฐํจ์๋ 2๊ฐ์ ์ซ์๋ฅผ ๋ฐ์ 1๊ฐ์ ์ซ์๋ฅผ ๋ฐํํ๋ค๋ผ๋ ๊ท์น์ด ์๋ค๋ฉด ์๋์๊ฐ์ ์๋ฌ๋ฅผ ๋ฐ์์์ผ ํจ์์ ์ผ๊ด์ฑ์ ๋ถ์ฌํ ์ ์๋ค.
interface Calculator {
(a: number, b: number): number;
}
// ๊ฐ๋ฐ์ A๊ฐ ์ค์๋ก ๋ฌธ์์ด์ ๋ฐํํ๊ฒ ์งฌ -> ๋ฐ๋ก ์๋ฌ ๋ฐ์! ๋นจ๊ฐ ์ค!
const multiply: Calculator = (a, b) => {
return "๊ฒฐ๊ณผ: " + (a * b); // Error: Type 'string' is not assignable to type 'number'.
};
3. react์์ ์ปดํฌ๋ํธ ์์ฑ์ interface๋ก ๋ง๋ค์ด๋๋ฉด props๋ก ๋ฐ์ดํฐ๋ฅผ ๋๊ฒจ์ค ๋ ์๊ธฐ๋ ํ์ ์๋ฌ๋ฅผ ์ค์ผ ์ ์์
์์ 1 : ๋ถ๋ชจ -> ์์ ๊ฐ์ Props ๊ฒ์ฆ
Mybutton.tsx : ํ์์ปดํฌ๋ํธ ์์ (onClick ์ ํ์ ์ ๋ช ์ํด๋์๋ค), ์ด๋ค ํจ์๊ฐ ๋์ด์์ผํ๋์ง ๋ช ์

๋ถ๋ชจ์ปดํฌ๋ํธ ์์

์์ 2
์์ -> ๋ถ๋ชจ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ด๋ ๊ฒฝ์ฐ
์์ ์ปดํฌ๋ํธ (UserForm.tsx)
interface UserFormProps {
// "๋ฌธ์์ด(username)์ ๋ฐ์์ ์๋ฌด๊ฒ๋ ๋ฐํํ์ง ์๋ ํจ์"
onSave: (username: string) => void;
}
const UserForm = ({ onSave }: UserFormProps) => {
const [name, setName] = useState("");
const handleSave = () => {
// ์ฌ๊ธฐ์ onSave๋ฅผ ํธ์ถํ ๋, ๋ฌธ์์ด์ ์ ๋ฃ์ผ๋ฉด TS๊ฐ ์๋ฌ๋ฅผ ๋
๋๋ค!
// "Argument of type 'string' is expected."
onSave(name);
};
return (
<div>
<input value={name} onChange={(e) => setName(e.target.value)} />
<button onClick={handleSave}>์ ์ฅ</button>
</div>
);
};
๋ถ๋ชจ ์ปดํฌ๋ํธ
const App = () => {
// ์์์ด ๋ฐ์ดํฐ๋ฅผ ๋ด์์ ํธ์ถํด์ค ํจ์
const handleUserSave = (name: string) => {
console.log("์๋ก์ด ์ ์ ์ด๋ฆ: ", name);
};
return (
// onSave ์๋ฆฌ์ handleUserSave๋ฅผ ์ ๋ฌ
<UserForm onSave={handleUserSave} />
);
};
์๋์๋ฆฌ

๋ถ๋ชจ ์ปดํฌ๋ํธ (App.tsx)

๋ถ๋ชจ์ชฝ์์ handleUserSave๋ฅผ ๋ง๋ค ๋ name์ด string์ผ๋ก ์ ํด์ฃผ์ง ์์ผ๋ฉด ์๋ฌ๊ฐ ๋ฐ์๋จ
handleUserSave๊ฐ ์์ ์ปดํฌ๋ํธ์ onSave๋ผ๋ ์๋ฆฌ(๋ณ์)์ ํ ๋น Assigned๋์๊ธฐ ๋๋ฌธ
react๋ ๋จ๋ฐฉํฅ ๋ฐ์ดํฐ ํ๋ฆ์ ์์น์ด ์๋ค. ๋ถ๋ชจ -> ์์์ผ๋ก๋ง ๋ฐ์ดํฐ๊ฐ ํ๋ฌ์ผํ๋ค๋ ๊ฒ์ธ๋ฐ, ์์์ปดํฌ๋ํธ์์ ๋ถ๋ชจ์๊ฒ ์ ๋ฌํ๋ ๋ฐฉ์์ State ๋์ด์ฌ๋ฆฌ๊ธฐ (Lifting State Up) ํจํด์ด ์๋ค.
ํจ์์ฐธ์กฐ (ํจ์ ๋ฉ๋ชจ๋ฆฌ์ ์ฃผ์๋ฅผ ์ ๋ฌํ๋ ๋ฐฉ์) ์ ๋ฌ์ ์๋ฐ์คํฌ๋ฆฝํธ ๊ธฐ๋ณธ์๋ฆฌ๋ฅผ ์ด์ฉํ๋ค.
๋ถ๋ชจ -> ์์ : ํจ์(๋๊ตฌ)์ ๋ฌ
์์ -> ๋ถ๋ชจ : ๊ทธ ํจ์๋ฅผ ์คํ(ํธ์ถ)ํ๋ฉด์ ๋ฐ์ดํฐ(์ธ์)๋ฅผ ์ค์ด ๋ณด๋
๋ถ๋ชจ์์ ์ง์ ํ ํจ์์ ์ค์ฒด์ธ handleUseSave๋ ์์์๊ฒ ์ ๋ฌ๋์์ ๋
์์์์ ์ง์ ๋ ์ธํฐํ์ด์ค (string์ ๋ฐ์ void๋ฆฌํด) UserFormProps๋ฅผ ๋ฐ๋ฅธ๋ค.
๋งค๊ฐ๋ณ์ ํ์
๊ณผ ๋ฐํ ํ์
์ด ๋์ผํ๋ฉด ์๋ฌ๊ฐ ์๋๋ค (์ด๋ฆ์ด ๋ค๋ฅธ๊ฑด ์๊ด X).
๋ถ,์ ์ฌ์ด์ props ์ ๋ฌ ๊ณผ์ ์์ ํ์
์ด ๋ง์ง ์์ผ๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํ๋ค
'Develop Study ๐ป' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [Python] TIL : HackerRank (0) | 2026.01.21 |
|---|---|
| TIL : Computation Design / Rhino / Grasshopper (0) | 2026.01.20 |
| [TypeScript] ํ์ ์คํฌ๋ฆฝํธ๋? (0) | 2026.01.18 |
| [TypeScript] ์ ๋์จ ํ์ , ์ธํฐ์น์ ํ์ / | & / ์ ๋์จํ์ ๊ณผ or์ฐ์ฐ ์ฐจ์ด/ | || (0) | 2026.01.18 |
| [TypeScript, Python] null, undefined, None , ? / ?? ์ฌ์ฉ๋ฒ ์๋ฏธ , ๋ณํฉ์ฐ์ฐ์, ์ต์ ๋ ์ฒด์ด๋ (0) | 2026.01.18 |