029

๐Ÿ˜‰ ํ—ท๊ฐˆ๋ ธ๋˜ & ๋ชฐ๋ž๋˜ ๋ถ€๋ถ„๋“ค๋งŒ ์ •๋ฆฌํ•˜๋Š” ๋‚˜๋งŒ์˜ TIL
๐Ÿ˜ฏ ๋ชจ๋“  ๊ฐ•์˜ ๋‚ด์šฉ์€ ์ ์ง€ ์•Š์•„์š”!

์˜ค๋Š˜์˜ ์†Œ๊ฐ์€?
TypeScript ์ •๋ง ์ •๋ง ๋ฐฐ์šฐ๊ณ  ์‹ถ์—ˆ๋‹ค.
React์™€ Vue๋ถ€ํ„ฐ ํ•ด์•ผํ•˜๊ธฐ์— ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์—ˆ์ง€๋งŒ ๋“œ๋””์–ด ๋•Œ๊ฐ€ ์™”๋‹ค.
์ง€๊ธˆ๊นŒ์ง€ ๋งŒ๋“  ๋ชจ๋“  ํ”„๋กœ์ ํŠธ ๋ฆฌํŒฉํ† ๋ง ํ•  ์ƒ๊ฐ์— ๋„ˆ๋ฌด ์‹ ๋‚œ๋‹ค.๐Ÿ˜‰
์—ญ์‹œ ์ƒˆ๋กœ์šด๊ฑธ ๋ฐฐ์šฐ๊ณ  ์ ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋„ˆ๋ฌด ์ฆ๊ฑฐ์›Œ




useImperativeHandle Hook

useImperativeHandle Hook์€ ํ‰๋ฒ”ํ•œ ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€๊ฐ€ ์•„๋‹Œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋“ฑ ํŠน์ˆ˜ํ•œ ์ปดํฌ๋„ŒํŠธ์— ์‚ฌ์šฉ๋œ๋‹ค.


ref(forwardRef, useRef)๋ฅผ ์ด์šฉํ•˜๋ฉด ์‚ฌ์šฉ์ž ์ •์˜ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์— ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฆ‰ ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

์—ฌ๊ธฐ์„œ useImperativeHandle Hook์„ ์‚ฌ์šฉํ•˜๋ฉด, ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ œ์–ดํ•  ์—ฌ๋Ÿฌ ํ•จ์ˆ˜๋“ค์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.


// forwardRef๋กœ ์ •์˜๋œ Input ์ปดํฌ๋„ŒํŠธ
const inputRef = useRef();
useImperativeHandle(ref, () => {
  clear: () => {
    inputRef.current.value = "";
  };
  focus: () => {
    inputRef.current.focus();
  };
});

return (
  <>
    Input: <input ref={inputRef} />
  </>
);




์ปดํฌ๋„ŒํŠธ ์‹ฌํ™”

React ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ฐ€์žฅ ๋งŽ์ด ํ•˜๋Š” ๊ณ ๋ฏผ์€ ๋‹จ์—ฐ ์ปดํฌ๋„ŒํŠธ๋Š” ์–ด๋–ป๊ฒŒ ์„ค๊ณ„ํ•ด์•ผ ํ• ๊นŒ? ์ด๋‹ค.


๋จผ์ € ์•„ํ‚คํ…์ฒ˜๋ถ€ํ„ฐ ์‚ดํŽด๋ณด์ž.

์•„ํ‚คํ…์ฒ˜์—๋Š” ์—ฌ๋Ÿฌ ์˜๋ฏธ๊ฐ€ ์žˆ์ง€๋งŒ, ์šฐ๋ฆฌ๊ฐ€ ์ผ์„ ์ž˜ ํ•˜๊ธฐ ์œ„ํ•ด ๋ชจ๋“ˆ์˜ ๊ตฌํ˜„๊ณผ ๋‚˜๋ˆ„๋Š” ๋ฐฉ๋ฒ•์„ ์ •ํ•จ์ด๋ผ๊ณ  ๋งํ•  ์ˆ˜ ์žˆ๋‹ค.


๊ทธ๋ ‡๋‹ค๋ฉด ๋ชจ๋“ˆ(์ปดํฌ๋„ŒํŠธ)์—์„œ๋Š” ์–ด๋– ํ•œ ๋ถ€๋ถ„์ด ์ค‘์š”ํ• ๊นŒ? ์‘์ง‘๋„์™€ ๊ฒฐํ•ฉ๋„๊ฐ€ ์žˆ๋‹ค



1. ์‘์ง‘๋„

  • ๋ชจ๋“ˆ ๋‚ด ํฌํ•จ๋œ ์š”์†Œ๋“ค์ด ์„œ๋กœ ์—ฐ๊ด€๋˜์–ด ์žˆ๋Š” ์ •๋„ ์ฆ‰, ๋ชจ๋“ˆ ๋‚ด ๊ธฐ๋Šฅ๋“ค์ด ํ•˜๋‚˜์˜ ์ฑ…์ž„์œผ๋กœ ์ž˜ ๋ญ‰์ณ ์žˆ๋Š”์ง€๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.
  • ๋†’์€ ์‘์ง‘๋„์ผ์ˆ˜๋ก ์ข‹์€ ์„ค๊ณ„
  • ์‘์ง‘๋„๊ฐ€ ๋†’์„ ์ˆ˜๋ก ํ•˜๋‚˜์˜ ์ฑ…์ž„์— ์ง‘์ค‘ํ•˜๊ณ , ๋…๋ฆฝ์„ฑ์„ ๋†’์ด๋ฉฐ, ์šฐ๋ฆฌ๊ฐ€ ์ˆ˜์ •ํ•˜๊ธฐ ์œ„ํ•œ ์š”์†Œ๋ฅผ ๋น ๋ฅด๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค.


์‘์ง‘๋„๋ฅผ ๋†’์ด๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•

  • ๊ณตํ†ต ํ์‡„ ์›์น™

๊ฐ™์€ ์ด์œ ๋กœ ๋™์ผํ•œ ์‹œ์ ์— ๋ณ€๊ฒฝ๋˜๋Š” ๊ธฐ๋Šฅ์„ ํ•˜๋‚˜์˜ ๋ชจ๋“ˆ๋กœ ๋ฌถ์–ด์•ผ ํ•œ๋‹ค๋Š” ์›์น™์ด๋‹ค.

์ฆ‰ ๊ฐ์ฒด ์ง€ํ–ฅ ์›์น™์ธ ๋‹จ์ผ ์ฑ…์ž„ ์›์น™์„ ์ปดํฌ๋„ŒํŠธ ๊ด€์ ์œผ๋กœ ๋ฐ”๋ผ๋ณธ ๊ฒƒ ์ด๋‹ค.

ํ•˜์ง€๋งŒ ๊ณผํ•˜๊ฒŒ ์ ์šฉํ•˜๋ฉด ์žฌ์‚ฌ์šฉ์„ฑ์ด ์ค„์–ด๋“ค ์ˆ˜ ์žˆ๋‹ค.


  • ๊ณตํ†ต ์žฌ์‚ฌ์šฉ ์›์น™

๋ชจ๋“ˆ ๋‚ด์˜ ๊ธฐ๋Šฅ๋“ค์€ ํ•จ๊ป˜ ์žฌ์‚ฌ์šฉ์ด ๋  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค๋Š” ์›์น™์ด๋‹ค.

๋ฐ˜๋Œ€๋กœ ์ด์•ผ๊ธฐํ•˜๋ฉด ํ•จ๊ป˜ ์žฌ์‚ฌ์šฉ์ด ๋  ์ˆ˜ ์—†๋‹ค๋ฉด ๋ถ„๋ฆฌํ•ด์•ผ ํ•œ๋‹ค๋Š” ๋œป์ด๋‹ค.

๊ณผํ•˜๊ฒŒ ์ ์šฉํ•˜๋ฉด ๊ฐœ๋ฐœ ์šฉ์ด์„ฑ์ด ์ค„์–ด๋“ค ์ˆ˜ ์žˆ๋‹ค.



๊ณตํ†ต ํ์‡„ ์›์น™๊ณผ ๊ณตํ†ต ์žฌ์‚ฌ์šฉ ์›์น™์€ ์„œ๋กœ ์œ„๋ฐฐ๋œ๋‹ค๊ณ  ๋งํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฆ‰, ์ƒํ™ฉ์— ๋”ฐ๋ผ ๊ณตํ†ต ํ์‡„ ์›์น™(์ ์€ ์ˆ˜์˜ ์ปดํฌ๋„ŒํŠธ, ์žฌ์‚ฌ์šฉ์„ฑ ๋‚ฎ์Œ)๊ณผ ๊ณตํ†ต ์žฌ์‚ฌ์šฉ ์›์น™(๋งŽ์€ ์ˆ˜์˜ ์ปดํฌ๋„ŒํŠธ, ์žฌ์‚ฌ์šฉ์„ฑ ๋†’์Œ)

์ด ๋‘˜ ์‚ฌ์ด๋ฅผ ์ ์ ˆํ•˜๊ฒŒ ์กฐ์ ˆํ•˜๋Š” ๊ฒƒ์ด ๊ฐœ๋ฐœ์ž์˜ ๋Šฅ๋ ฅ์ด๋‹ค.




2. ๊ฒฐํ•ฉ๋„

  • ๋‹ค๋ฅธ ๋ชจ๋“ˆ๊ณผ์˜ ์˜์กด์„ฑ์— ๋Œ€ํ•œ ์ •๋„
  • ๋ชจ๋“ˆ๊ณผ ๋ชจ๋“ˆ ์‚ฌ์ด์˜ ๊ด€๊ณ„๊ฐ€ ์–ด๋Š ์ •๋„์ธ๊ฐ€๋ฅผ ๋‚˜ํƒ€๋ƒ„
  • ๋‚ฎ์€ ๊ฒฐํ•ฉ๋„์ผ์ˆ˜๋ก ์ข‹์€ ์„ค๊ณ„
  • ๊ฒฐํ•ฉ๋„๊ฐ€ ๋†’์„ ์ˆ˜๋ก ์ˆ˜์ •์— ๋Œ€ํ•ด ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ์ •๋„๊ฐ€ ์ฆ๊ฐ€


๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•

  • ์•ˆ์ •๋œ ์˜์กด์„ฑ ์›์น™

๋” ์•ˆ์ •๋œ ๋ชจ๋“ˆ์„ ์˜์กดํ•˜์ž๋Š” ์›์น™์ด๋‹ค.

์ฆ‰ ์˜์กดํ•˜๋Š” ๋ชจ๋“ˆ์ด ์ ๊ณ , ์˜์กด๋˜๋Š” ๋ชจ๋“ˆ์ด ๋งŽ์„ ์ˆ˜๋ก ์•ˆ์ •์ ์ธ ๋ชจ๋“ˆ(์ปดํฌ๋„ŒํŠธ)์ด๋‹ค.

์•ˆ์ •์„ฑ ์ง€ํ‘œ๋Š” Fan-out / (Fan-in + Fan-out)์œผ๋กœ ๊ณ„์‚ฐ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

๋”ฐ๋ผ์„œ 0์— ๊ฐ€๊นŒ์šธ์ˆ˜๋ก ์•ˆ์ •๋˜๊ณ  1์— ๊ฐ€๊นŒ์šธ์ˆ˜๋ก ๋ถˆ์•ˆ์ •ํ•œ ์ปดํฌ๋„ŒํŠธ์ด๋‹ค.

Fan-out : ์˜์กด๋˜๋Š” ๊ฒƒ / Fan-in: ์˜์กดํ•˜๋Š” ๊ฒƒ


  • ์•ˆ์ •๋œ ์ถ”์ƒํ™” ์›์น™

์ปดํฌ๋„ŒํŠธ๋Š” ์•ˆ์ •๋œ ๋งŒํผ ์ถ”์ƒ์ ์ด์–ด์•ผ ํ•œ๋‹ค๋Š” ์›์น™์ด๋‹ค.

์ฆ‰ ์ปดํฌ๋„ŒํŠธ์˜ ์•ˆ์ •์„ฑ์ด 0์— ๊ฐ€๊นŒ์šธ์ˆ˜๋ก, ์ถ”์ƒ์„ฑ์€ 1์— ๊ฐ€๊นŒ์›Œ์•ผ ํ•œ๋‹ค.

์ถ”์ƒ์„ฑ์€ ์ถ”์ƒ ํด๋ž˜์Šค ์ˆ˜ / ํด๋ž˜์Šค ์ˆ˜๋กœ ๊ณ„์‚ฐํ•œ๋‹ค.

(ํ•˜์ง€๋งŒ React ์ปดํฌ๋„ŒํŠธ๋Š” UI ์š”์†Œ๊ฐ€ ํฌํ•จ๋˜์–ด์žˆ์–ด ํ•ด๋‹น ๊ณต์‹์„ ์ ์šฉํ•  ์ˆ˜๋Š” ์—†๋‹ค.)

// ์–ด๋– ํ•œ ๊ฒƒ๋„ ๋“ค์–ด์˜ฌ ์ˆ˜ ์žˆ๋Š” ์ถ”์ƒ์ ์ธ ์ปดํฌ๋„ŒํŠธ ์˜ˆ์‹œ
const CanBeAnything = ({ children }) => {
  return <Fragment>{children}</Fragment>;
};



3. ์ปดํฌ๋„ŒํŠธ ๋‹จ์œ„

์ข‹์€ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๊ฐ€์ ธ์•ผ ํ•˜๋Š” ์‘์ง‘๋„์™€ ๊ฒฐํ•ฉ๋„์— ๋Œ€ํ•ด ์•Œ์•„๋ดค๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์–ด๋–ค ๋‹จ์œ„๋กœ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋‚˜๋ˆ ์•ผ ํ• ๊นŒ?

ํ”„๋ก ํŠธ๋Š” ๋ณ€ํ™”๊ฐ€ ํฐ ์†Œํ”„ํŠธ์›จ์–ด์ด๋‹ค. ์ฆ‰ ๋ฐฑ์—”๋“œ์ฒ˜๋Ÿผ ๊ธฐ๋Šฅ, ๋„๋ฉ”์ธ ๋‹จ์œ„๋กœ ๋ ˆ์ด์–ด๋ฅผ ๋‚˜๋ˆ„๊ธฐ ์• ๋งคํ•˜๋‹ค.

๋”ฐ๋ผ์„œ ์›ฌ๋งŒํ•˜๋ฉด ์ถ”์ƒํ™” ๋‹จ์œ„(Tag, Style)๋กœ ๋‚˜๋ˆ„๋Š” ๊ฒƒ์ด ํŽธํ•˜๋‹ค.




TypeScript

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋Š” ๋งˆ์ดํฌ๋กœ์†Œํ”„ํŠธ์—์„œ ๋งŒ๋“ค์—ˆ๊ณ , ๋ง ๊ทธ๋Œ€๋กœ ํƒ€์ž…์ด ์ ์šฉ๋œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ผ๋Š” ์˜๋ฏธ์ด๋‹ค.



1. ์žฅ์ 

  • ํƒ€์ž…์ด ์กด์žฌํ•˜๋ฉด ์ปดํŒŒ์ผ ๋‹จ๊ณ„์—์„œ ๋ฏธ๋ฆฌ ์˜ค๋ฅ˜๋ฅผ ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์•ˆ์ •์„ฑ์„ ๊ฐ€์ง„๋‹ค.
  • ํƒ€์ž…์„ ๋ณด๊ณ  ํ•ด๋‹น ๋กœ์ง์ด ์–ด๋–ค ์ผ์„ ํ•˜๋Š”์ง€ ๋ฏธ๋ฆฌ ์•Œ ์ˆ˜ ์žˆ์–ด ๊ฐ€๋…์„ฑ์ด ์ข‹๋‹ค.



2. ๋‹จ์ 

  • ์ดˆ๊ธฐ ์„ค์ •์ด ํ•„์š”ํ•˜๋‹ค.
  • ํƒ€์ž…์ด ๊ฐ•์ œ์ ์ด๋‹ค๋ณด๋‹ˆ, ์Šคํฌ๋ฆฝํŠธ ์–ธ์–ด์˜ ์œ ์—ฐ์„ฑ์ด ๋‚ฎ์•„์ง„๋‹ค.
  • ์ปดํŒŒ์ผ ์‹œ๊ฐ„์ด ๊ธธ์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค.




TypeScript ๋ฌธ๋ฒ•

1. ํƒ€์ž… ์ฃผ์„๊ณผ ํƒ€์ž… ์ถ”๋ก 

ํƒ€์ž… ์ฃผ์„์€ ๋ณ€์ˆ˜, ์ƒ์ˆ˜ ํ˜น์€ ๋ฐ˜ํ™˜ ๊ฐ’์ด ๋ฌด์Šจ ํƒ€์ž…์ธ์ง€๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

ํƒ€์ž… ์ถ”๋ก ์€ ํ•ด๋‹น ๋ณ€์ˆ˜๊ฐ€ ์–ด๋–ค ํƒ€์ž…์ธ์ง€ ์ถ”๋ก ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. (์ด๋ฅผ ์ƒ๋žตํ•˜๋ฉด ์ปดํŒŒ์ผ ํƒ€์ž„์— ์•Œ์•„๋‚ธ๋‹ค.)

// 1. ํƒ€์ž… ์ฃผ์„
let a: number = 1;
let b: boolean = false;
let c: string = "TypeScript";
let arr: number[] = []; // number ํƒ€์ž…์˜ ๋ณ€์ˆ˜๋งŒ ๋ฐฐ์—ด์— ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค.
let i: "good" = "good"; // i๋ผ๋Š” ๋ณ€์ˆ˜๋Š” 'good'์˜ ๋ฌธ์ž์—ด๋งŒ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋‹ค.
let h: any = 3; // ์•„๋ฌด ๊ฐ’์ด๋‚˜ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋‹ค.

function add(a: number, b: number): number {
  return a + b;
}

// 2. ํƒ€์ž… ์ถ”๋ก  (number ํƒ€์ž…์ž„์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.)
let b = 2;



2. ์ธํ„ฐํŽ˜์ด์Šค

๊ฐ์ฒด์˜ ํƒ€์ž…์„ ์ •์˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. interface๋ผ๋Š” ํ‚ค์›Œ๋“œ๋กœ ๊ฐ€๋Šฅํ•˜๋‹ค.

interface Company {
  name: string;
  age: number;
  address?: string; // ์„ ํƒ ์†์„ฑ(Optional)
}

const programmers: Company = {
  // ๋ฌด์กฐ๊ฑด name, age๊ฐ€ ๋“ค์–ด๊ฐ„๋‹ค.
  // ๋‹ค๋งŒ address๋Š” ์„ ํƒ ์†์„ฑ์ด๋ฏ€๋กœ undefined๊ฐ€ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋‹ค.
};


๋˜ํ•œ ์ •์˜ ํ›„ ๋ฐ”๋กœ ๊ฐ’์„ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๋Š” ์ต๋ช… ์ธํ„ฐํŽ˜์ด์Šค๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฝ”๋“œ ๋‚ด์— ๋”ฑ ํ•œ๋ฒˆ๋งŒ ์‚ฌ์šฉ๋œ๋‹ค๋ฉด ํ•ด๋‹น ํ˜•์‹์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ๊น”๋”ํ•˜๋‹ค.

const person: {
  name: string;
  age?: number;
} = {
  name: "Jung Ji Young",
  age: 25,
};



3. tuple

๋ฐฐ์—ด์„ Tuple๋กœ ์ด์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.

const tuple: [string, number] = ["JiYoung", 25];



4. enum

์—ด๊ฑฐํ˜•์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

enum Color = {
	RED, // 0
	ORANGE, // 1
	YELLOW // 2
} // RED = 'red' ๋“ฑ์œผ๋กœ ์ปค์Šคํ…€ํ•  ์ˆ˜ ์žˆ๋‹ค.

const color = Color.YELLOW; // 2



5. ๋Œ€์ˆ˜ ํƒ€์ž…

์—ฌ๋Ÿฌ ์ž๋ฃŒํ˜•์˜ ๊ฐ’์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

ํ•ฉ์ง‘ํ•ฉ ํƒ€์ž…๊ณผ ๊ต์ง‘ํ•ฉ ํƒ€์ž…์ด ์žˆ๋‹ค.

// 1. ํ•ฉ์ง‘ํ•ฉ ํƒ€์ž…
let numOrStr: number | string = 1; // number ๋˜๋Š” string์„ ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค.

// 2. ๊ต์ง‘ํ•ฉ ํƒ€์ž…
// ํ•˜๋‚˜์˜ ๋ณ€์ˆ˜๊ฐ€ number์ด๊ณ  string์ผ ์ˆ˜๋Š” ์—†๋‹ค. ์ฆ‰ ์›์‹œ ํƒ€์ž…์—์„œ ์‚ฌ์šฉ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.
interface Name {
  name: string;
}

interface Age {
  age: number;
}

let Jiyoung: Name & Age = {
  // Name, Age ๋‘˜ ๋‹ค ๋„ฃ์–ด์ค˜์•ผ ํ•œ๋‹ค.
  name: "Jung JiYoung",
  age: 25,
};
type Person = Name & Age; // ์ƒˆ๋กœ์šด ํƒ€์ž…์„ ๋งŒ๋“ค์–ด ๋‚ผ ์ˆ˜ ์žˆ๋‹ค.



6. Optional

์„ ํƒ ์†์„ฑ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ž‘์„ฑ๋˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค.

interface Post {
	title: string;
	content: string;
}

interface ResponseData {
	post?: Post;
	message?: string;
	status: number;
}

const response: ResponseData[] = {
	{
		post: {
			title: 'Hello',
			content: 'How are you?'
		},
		status: 200
	},
	{
		message: 'Server Error',
		status: 500
	}
}

console.log(response[1].post?.title);
// title์ด ์—†์–ด๋„ ์˜ค๋ฅ˜๊ฐ€ ๋‚˜์ง€ ์•Š๊ณ  undefined๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค.
// ์ฆ‰ ๋ฐ์ดํ„ฐ๊ฐ€ ์—†๋‹ค๋ฉด ์ž๋™์œผ๋กœ undefined๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์˜๋ฏธ์ด๋‹ค.



7. Generic

ํ•˜๋‚˜์˜ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์—ฌ๋Ÿฌ ํƒ€์ž…์„ ์ด์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ๋ฐฉ๋ฒ•

interface Value<T> {
  value: T;
}

const value: Value<number> = {
  value: 1,
};
const value: Value<string> = {
  value: "1",
};


์ œ๋„ค๋ฆญ์€ ํ•จ์ˆ˜์—๋„ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

function toString<T>(a: T): string {
  return `${a}`;
}

console.log(toString<number>(5));



8. Partial, Required, Pick, Omit

๊ธฐ์กด interface๋ฅผ ์žฌํ™œ์šฉ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.

interface User {
  id: number;
  name: string;
  age: number;
  createdAt?: string;
  updatedAt?: string;
}

// 1. partial: ๋ชจ๋“  ํ•„๋“œ๋ฅผ Optional๋กœ ๋งŒ๋“ค์–ด์ค€๋‹ค.
const partial: Partial<User> = {};

// 2. Required: ๋ชจ๋“  ํ•„๋“œ๋ฅผ ํ•„์ˆ˜ ์†์„ฑ์œผ๋กœ ๋งŒ๋“ค์–ด์ค€๋‹ค.
const required: Required<User> = {
  id: 1,
  name: "Jiyoung",
  age: 25,
  createdAt: "",
  updatedAt: "",
};

// 3. Pick: ํŠน์ • ํ•„๋“œ๋งŒ ๊ณจ๋ผ์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
const pick: Pick<User, "name" | "age"> = {
  name: "Jiyoung",
  age: 25,
};

// 4. Omit: ํŠน์ • ํ•„๋“œ๋งŒ ๋นผ๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
const omit: Omit<User, "id" | "createdAt" | "updatedAt"> = {
  name: "Jiyoung",
  age: 25,
};


์ด 4๊ฐ€์ง€ ๋ฌธ๋ฒ•์€ ์„ž์–ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

const mixed = Omit<User, 'id' | 'createdAt' | 'updatedAt'> & Pick<Partial<User>, 'age'> = {
	name: '', // age๋Š” Optional์ด ๋ฉ๋‹ˆ๋‹ค.
}



9. extends

ํŠน์ • ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†๋ฐ›์•„ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.

interface Time {
	hour: number;
	minute: number;
	second: number;
}

// DateTime์€ Time ํ•„๋“œ ์™ธ์—๋„ ์ •์˜ํ•œ ์†์„ฑ๋“ค์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.
interface DateTime extends Time {
	year: number;
	month: number;
	day: number;
}

// ์ด๋ ‡๊ฒŒ Pick, Omit, Partial, Required๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
interface CustomTime extends Pick<Time, 'hour' | 'minute'>





์ถœ์ฒ˜

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

์นดํ…Œ๊ณ ๋ฆฌ: ,

์—…๋ฐ์ดํŠธ:

๋Œ“๊ธ€๋‚จ๊ธฐ๊ธฐ