Typescript

νƒ€μž…μŠ€ν¬λ¦½νŠΈ - Generic (μ œλ„€λ¦­)

hyo.loui 2023. 1. 19. 16:50

🎯λͺ©μ  :

TS  Generic (μ œλ„€λ¦­), 정리 및 볡슡

 


1. μ œλ„€λ¦­ μ΄λž€?

μ œλ„€λ¦­μ€ νƒ€μž…μ„ 마치 ν•¨μˆ˜μ˜ νŒŒλΌλ―Έν„°μ²˜λŸΌ μ‚¬μš© ν•˜λŠ” 것이닀

말둜만 ν•˜λ©΄ 감이 잘 μ•ˆμ˜€κ³  이해가 μ•ˆλœλ‹€.

 

ν•˜μ§€λ§Œ νŒŒλΌλ―Έν„°μ˜ μƒκΉ€μƒˆμ™€ λŒ€μ‘°ν•΄μ„œ 머릿속에 λ– μ˜¬λ €μ•Ό 이해가 잘 λœλ‹€

// Generic

function generic<T>(any: T): T {
  return any;
}
generic<number>(1); // 1
generic<string>("1"); // "1"
generic<boolean>(true); // true

 

function ν•¨μˆ˜λͺ…<T>

μ—¬κΈ° <T>λ₯Ό λ”°λΌμ„œ νƒ€μž…μ΄ μ „λ‹¬λ˜κ³ 

 

νŒŒλΌλ―Έν„°μ™€ ν•¨μˆ˜νƒ€μž…

: T 에 μ „λ‹¬λœλ‹€!

 


2.  μ œλ„€λ¦­ ν™œμš©

 

1. getIteArray λŠ” λ°°μ—΄(νŒŒλΌλ―Έν„°)μ—μ„œ, index(νŒŒλΌλ―Έν„°)λ²ˆμ§Έμ— μžˆλŠ” 것을 μ°ΎλŠ” ν•¨μˆ˜

2. pushItemArray λŠ” λ°°μ—΄(νŒŒλΌλ―Έν„°)에 item(νŒŒλΌλ―Έν„°)둜 λ“€μ–΄μ˜¨ 값을 μΆ”κ°€(push)ν•΄μ£ΌλŠ” ν•¨μˆ˜

function getItemArray<T>(arr: T[], index: number): T {
  return arr[index];
}
function pushItemArray<T>(arr: T[], item: T): void {
  arr.push(item);
}

const nums = [1, 2, 3, 4];

const techStack = ["js", "react", "redux"];

getItemArray(nums, 3); // 4
pushItemArray(nums, 5); // [1,2,3,4,5]

getItemArray(techStack, 2); // "redux"
pushItemArray(techStack, "RTK"); // ["js", "react", "redux", "RTK"]

3. μ œλ„€λ¦­ νƒ€μž… λ³€μˆ˜

 

2가지 예제λ₯Ό 보며 μƒκ°ν•΄λ³΄μž

// μ œλ„€λ¦­ νƒ€μž… λ³€μˆ˜

function printout<T>(input: T): T[] {
  console.log(input.length); // Error νŒŒλΌλ―Έν„°λ‘œ λ“€μ–΄μ˜€λŠ” νƒ€μž…μ΄ arrayκ°€ μ•„λ‹ˆκΈ° λ•Œλ¬Έμ— .lengthκ°€ ν™œμš©μ΄ μ•ˆλœλ‹€
  return input;
}
function printout<T>(input: T[]): T[] {
  console.log(input.length);
  return input;
}
printout<number>([1, 2, 3, 4]); // 4

μ—λŸ¬ 없이 정상 μž‘λ™ν•œλ‹€!

 


4. μ œλ„€λ¦­ μ œμ•½ 쑰건

 

// μ œλ„€λ¦­ μ œμ•½ 쑰건
interface LengthWise {
  length: number;
}
function printOutt<T extends LengthWise>(input: T): T {
  console.log(input.length);
  return input;
}

// printOutt(19); // Error, 숫자 νƒ€μž…μ—λŠ” `length`κ°€ μ‘΄μž¬ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ 였λ₯˜ λ°œμƒ
const test = printOutt({ length: 4, value: "hi" }); // `input.length` μ½”λ“œλŠ” 객체의 속성 μ ‘κ·Όκ³Ό 같이 λ™μž‘ν•˜λ―€λ‘œ 였λ₯˜ μ—†μŒ
console.log("πŸ‘‰πŸ‘‰  test", test);

  // 4
  // πŸ‘‰πŸ‘‰  test { length: 4, value: 'hi' }


 

 μ΅œμ’… 정리 

  1. μ œλ„€λ¦­μ„ μ‚¬μš©ν•˜λ©΄ ν•¨μˆ˜μ˜ νŒŒλΌλ―Έν„° 처럼 μ‚¬μš©μ΄ κ°€λŠ₯ν•˜λ‹€!
  2. <T>둜 전달받아 T μ—μ„œ ν™œμš© κ°€λŠ₯ν•˜λ‹€.
  3. μ œλ„€λ¦­ νƒ€μž… λ³€μˆ˜λ‘œ T[ ] 둜 λ§Œλ“€λ©΄ λ°°μ—΄νƒ€μž…μ΄ λœλ‹€.
  4. μ œμ•½μ‘°κ±΄μœΌλ‘œ extendsλ₯Ό ν™œμš©ν•΄ νŒŒλΌλ―Έν„° νƒ€μž…μ„ μΆ”κ°€ν•  수 μžˆλ‹€.