๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Develop Study ๐Ÿ’ป

[TypeScript] ์ธํ„ฐํŽ˜์ด์Šค๋กœ ํ•จ์ˆ˜์˜ ํƒ€์ž… ์ •์˜

728x90
๋ฐ˜์‘ํ˜•

์˜ค๋ฅธ์ชฝ์ฒ˜๋Ÿผ ๊ทธ๋ƒฅ ํ•จ์ˆ˜๋ฅผ ์“ฐ๋ฉด ๋˜๋Š”๊ฑด๋ฐ ์™œ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์—์„œ๋Š” ์ € ํƒ€์ž… ์ง€์ • 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 ์ „๋‹ฌ ๊ณผ์ •์—์„œ ํƒ€์ž…์ด ๋งž์ง€ ์•Š์œผ๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค 

728x90
๋ฐ˜์‘ํ˜•