Frontend ๊ฐœ๋ฐœ์ž - hyo.loui

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ - Generic (์ œ๋„ค๋ฆญ) ๋ณธ๋ฌธ

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๋ฅผ ํ™œ์šฉํ•ด ํŒŒ๋ผ๋ฏธํ„ฐ ํƒ€์ž…์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.