๋ฐ˜์‘ํ˜•

์ œ๋„ค๋ฆญ ์†Œ๊ฐœ


์ œ๋„ค๋ฆญ์€ ํƒ€์ž…์„ ํ•จ์ˆ˜์˜ ํŒŒ๋ผ๋ฏธํ„ฐ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. ์ œ๋„ค๋ฆญ์€ ์žฌ์‚ฌ์šฉ์„ฑ์ด ๋†’์€ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค ๋•Œ ์ž์ฃผ ์‚ฌ์šฉํ•œ๋‹ค. ํ•œ ๊ฐ€์ง€ ํƒ€์ž…๋ณด๋‹ค ์—ฌ๋Ÿฌ๊ฐ€์ง€ ํƒ€์ž…์—์„œ ๋™์ž‘ํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์œ ์šฉํ•˜๋‹ค.

 

์ œ๋„ค๋ฆญ ๊ธฐ๋ณธ ๋ฌธ๋ฒ•


๐Ÿ’ก T๋Š” Type parameter์˜ ์•ฝ์ž๋กœ ๊ด€์šฉ์ ์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค. ๊ผญ T๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•˜๋Š”๊ฑด ์•„๋‹ˆ๋‹ค.

 

์•„๋ž˜ ํ•จ์ˆ˜์˜ textํŒŒ๋ผ๋ฏธํ„ฐ์—” hi 10 true ๋“ฑ ์–ด๋–ค ํƒ€์ž…์˜ ๊ฐ’์ด ๋“ค์–ด๊ฐ€๋”๋ผ๋„ ๊ทธ๋Œ€๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ ๋ชจ๋“  ํƒ€์ž…์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ์ด์œ ๋Š” ํƒ€์ž…์„ ๋”ฐ๋กœ ์ง€์ •ํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ์•”๋ฌต์ ์œผ๋กœ any ํƒ€์ž…์ด ๋ผ์„œ ๊ทธ๋Ÿฐ ๊ฒƒ์ด๋‹ค.

function getText(text) {
  return text;
}

 

any ํƒ€์ž…์€ ํƒ€์ž… ๊ฒ€์‚ฌ๋ฅผ ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋–ค ํƒ€์ž…์ด ๋“ค์–ด๊ฐ€๊ณ , ๋ฐ˜ํ™˜๋˜๋Š”์ง€ ์•Œ ์ˆ˜ ์—†๋‹ค.

 

์•„๋ž˜ ํ•จ์ˆ˜๋Š” ์ œ๋„ค๋ฆญ ๊ธฐ๋ณธ ๋ฌธ๋ฒ•์ด ์ ์šฉ๋œ ํ˜•ํƒœ๋‹ค. ์œ„ ํ•จ์ˆ˜์™€ ๋น„์Šทํ•˜๊ฒŒ ์–ด๋–ค ํƒ€์ž…์ด๋“  ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋„˜๊ธธ ์ˆ˜ ์žˆ๋‹ค.

function getText<T>(text: T): T {
  return text;
}

ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ์•„๋ž˜์ฒ˜๋Ÿผ ํƒ€์ž…์„ ์ง์ ‘ ๋„˜๊ฒจ์ค„ ์ˆ˜ ์žˆ๋‹ค. ์•„๋ž˜ 2๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค.

getText<string>('hi'); // ํ˜น์€ getText('hi')
getText<number>(10); // ํ˜น์€ getText(10)
getText<boolean>(true); // ํ˜น์€ getText(true)

 

getText<string>('hi') ์ฝ”๋“œ๋กœ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ–ˆ์„ ๋•Œ ์ œ๋„ค๋ฆญ์ด ์ ์šฉ๋œ ํ•จ์ˆ˜๋Š” ์•„๋ž˜ ๋ชจ์–‘๊ณผ ๊ฐ™์•„์ง„๋‹ค. ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ์ œ๋„ค๋ฆญ ๊ฐ’์œผ๋กœ string์„ ๋„˜๊ฒผ๊ธฐ ๋•Œ๋ฌธ์— ํ•จ์ˆ˜์˜ T ๋ถ€๋ถ„์ด string์œผ๋กœ ์ ์šฉ๋œ ๊ฒƒ์ด๋‹ค(์ •ํ™•ํžˆ ๋งํ•˜๋ฉด ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ๋„˜๊ธด ํƒ€์ž…์— ๋Œ€ํ•ด ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ถ”์ •ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ ๊ฒƒ)

// ํŒŒ๋ผ๋ฏธํ„ฐ, ๋ฐ˜ํ™˜๊ฐ’ ๋ชจ๋‘ string
function getText<string>(text: string): string {
  return text;
}

 

์ œ๋„ค๋ฆญ ํƒ€์ž… ์ œํ•œ


๋งŒ์•ฝ ํ•จ์ˆ˜ ์ธ์ž๋กœ ๋ฐ›์€ ๋ฌธ์ž์—ด์˜ length๋ฅผ ํ™•์ธํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด .length ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค. ํ•˜์ง€๋งŒ ์•„๋ž˜์ฒ˜๋Ÿผ ts(2339) ์ปดํŒŒ์ผ๋Ÿฌ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ์ œ๋„ค๋ฆญ ํ•จ์ˆ˜ ์ฝ”๋“œ์˜ T ๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ์™€ ๋ฐ˜ํ™˜ ๊ฐ’ ํƒ€์ž…์— any๋ฅผ ์ง€์ •ํ•œ ๊ฒƒ๊ณผ ๊ฐ™์€ ๋™์ž‘์„ ํ•œ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ ์ž…์žฅ์—์„  .length ์†์„ฑ์ด ์—†๋Š” number ํƒ€์ž… ๋“ฑ์ด ์˜ฌ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์„ ๊ฐ์•ˆํ•˜์—ฌ .length ์†์„ฑ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด๋‹ค.

 

 

๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์€ ํƒ€์ž… ๊ฐ€๋“œ๋ฅผ ์ด์šฉํ•ด ํŠน์ • ํƒ€์ž…๋งŒ ํ•ธ๋“ค๋งํ•˜๋ฉด ๋œ๋‹ค.

function getText<T>(text: T): T {
  if (typeof text === 'string') {
    console.log(text.length); // 5
  }
  return text;
}

getText('Hello');

 

๋ฐฐ์—ด์„ ์ธ์ž๋กœ ๋ฐ›์•„ length๋ฅผ ์‚ฌ์šฉํ•ด๋„ ๊ฐ™์€ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ์ด๋• T[] ํ˜•์‹์˜ ์ œ๋„ค๋ฆญ ํƒ€์ž…์„ ์ •์˜ํ•˜๋ฉด ๋œ๋‹ค. ๋” ์—„๋ฐ€ํ•˜๊ฒŒ ๋งํ•˜๋ฉด ์ œ๋„ค๋ฆญ ํƒ€์ž…์„ ๋ฐฐ์—ด[]๋กœ ์ œํ•œํ•œ ๊ฒƒ์ด๋‹ค.

function getText<T>(text: T[]): T[] {
  // ๋” ๋ช…์‹œ์ ์ธ ์ œ๋„ค๋ฆญ ์„ ์–ธ ๋ฐฉ๋ฒ• : function getText<T>(text: Array<T>): Array<T> { ... }
  console.log(text.length); // 2
  return text;
}

getText(['Hello', 'World']);

 

extends ํ‚ค์›Œ๋“œ ํ™œ์šฉ โญ๏ธ

๋งŒ์•ฝ ๋ฐฐ์—ด๋„ ๋ฐ›๊ณ  ์‹ถ๊ณ , ๋ฌธ์ž์—ด๋„ ๋ฐ›๊ณ  ์‹ถ๋‹ค๋ฉด? ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ด์šฉํ•ด length ํƒ€์ž…์„ ์ •์˜ํ•˜๋ฉด ๋œ๋‹ค.

interface LengthType {
  length: number; // length ์†์„ฑ์€ ์ˆซ์ž์ด๋ฏ€๋กœ number๋กœ ์ •์˜
}

 

์ด์ œ ํ•จ์ˆ˜์— extends ํ‚ค์›Œ๋“œ๋ฅผ ์ด์šฉํ•ด LengthType์„ ์„ ์–ธํ•œ๋‹ค. extends ํ‚ค์›Œ๋“œ๋Š” ๊ธฐ์กด ์ •์˜ํ–ˆ๋˜ ์ธํ„ฐํŽ˜์ด์Šค ํ˜น์€ ํƒ€์ž…์„ ํ™•์žฅํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. ๊ทธ๋Ÿผ ์ œ๋„ค๋ฆญ์œผ๋กœ ๋ฐ›์€ ํƒ€์ž…์€ ํ•ญ์ƒ LengthType์˜ ํ•˜์œ„ ํƒ€์ž…์ธ ๊ฒƒ์œผ๋กœ ์ธ์‹ํ•ด์„œ LengthType์— ์žˆ๋Š” length ์†์„ฑ๋„ ๊ฐ€์ง€๊ฒŒ ๋œ๋‹ค.

function getText<T extends LengthType>(text: T): T {
  console.log(text.length);
  return text;
}

getText('abc'); // 3 (๋ฌธ์ž์—ด์€ length ์†์„ฑ์„ ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฐ€์ง€๋ฏ€๋กœ OK)
getText(['Hello', 'World']); // 2 (๋ฐฐ์—ด์€ length ์†์„ฑ์„ ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฐ€์ง€๋ฏ€๋กœ OK)
getText(10); // Error
getText({ length: 10 }); // 10 (๊ฐ์ฒด์— length ์†์„ฑ์„ ํฌํ•จํ–ˆ์œผ๋ฏ€๋กœ OK)
getText({ len: 10 }); // Error (๊ฐ์ฒด์— length ์†์„ฑ์ด ์ •์˜๋˜์–ด ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— Error)

 

๐Ÿ’ก ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ func(...) ์„ ๋ช…์‹œํ•˜์ง€ ์•Š์œผ๋ฉด ํ˜ธ์ถœ์‹œ ๋„˜๊ฒผ๋˜ ์ธ์ž์˜ ํƒ€์ž…์œผ๋กœ ์ถ”๋ก ๋œ๋‹ค.

 

keyof ํ‚ค์›Œ๋“œ ํ™œ์šฉ

์•„๋ž˜ name price stock ์†์„ฑ์„ ๊ฐ€์ง„ ShoppingItem์ด๋ž€ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์žˆ๋‹ค.

interface ShoppingItem {
  name: string;
  price: number;
  stock: number;
}

 

์•„๋ž˜ ํ•จ์ˆ˜์˜ ์ธ์ž๊ฐ€ ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ๊ฐ€์ง„ ์†์„ฑ๋งŒ ๋ฐ›๋„๋ก ์ œ์•ฝ์„ ๊ฑธ๊ณ  ์‹ถ๋‹ค๋ฉด keyof ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค. ๊ทธ๋Ÿผ ShoppingItem ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๊ฐ€์ง„ ์†์„ฑ(key)๋งŒ ํƒ€์ž…(์ธ์ž)์œผ๋กœ ์˜ฌ ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰ ShoppingItem ์ธํ„ฐํŽ˜์ด์Šค์˜ 3๊ฐœ ์†์„ฑ์ค‘ 1๊ฐœ๊ฐ€ ์ œ๋„ค๋ฆญ(T)์œผ๋กœ ์˜ฌ ๊ฒƒ์ด๋ผ๊ณ  ์ •์˜ํ•ด์ฃผ๋Š” ๊ฒƒ๊ณผ ๊ฐ™๋‹ค.

function getShoppingItemOption<T extends keyof ShoppingItem>(itemOption: T): T {
  return itemOption;
}

getShoppingItemOption('name'); // ok
getShoppingItemOption('names'); // error

 

option + esc๋ฅผ ๋ˆ„๋ฅด๋ฉด ์ธ์ž๋กœ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋Š” ์ž๋™์™„์„ฑ ๋ชฉ๋ก์ด ๋‚˜์˜จ๋‹ค. ShoppingItem์˜ ํ‚ค๋“ค์ด ๋‚˜์˜ค๊ณ  ์žˆ๋Š” ๋ชจ์Šต

 

์•„๋ž˜์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

function getProperty<T, O extends keyof T>(obj: T, key: O) {
  return obj[key];
}
let obj = { a: 1, b: 2, c: 3 };

getProperty(obj, 'a'); // ok
getProperty(obj, 'z'); // error: "z"๋Š” "a", "b", "c" ์†์„ฑ์— ํ•ด๋‹นํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

 

์ œ๋„ค๋ฆญ์€ ์–ธ์ œ ์‚ฌ์šฉํ• ๊นŒ? — ์ œ๋„ค๋ฆญ์˜ ์žฅ์ 


์•„๋ž˜ ์ฝ”๋“œ์—์„œ logText ํ•จ์ˆ˜๋Š” ๋ฌธ์ž์—ด๋งŒ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค. ๋งŒ์•ฝ ์ด ํ•จ์ˆ˜์—์„œ ์ˆซ์ž ํƒ€์ž…๋„ ๋ฐ›๊ณ  ์‹ถ๋‹ค๋ฉด ๋™์ผํ•œ ๋กœ์ง์˜ ํ•จ์ˆ˜๋ฅผ ์ค‘๋ณตํ•ด์„œ ๋งŒ๋“ค๊ฑฐ๋‚˜ ์œ ๋‹ˆ์˜จ ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

function logText(text: string): string {
  console.log(text);
  return text;
}

logText('Hello');
logText(10);

 

ํ•จ์ˆ˜ ์ค‘๋ณต ์ƒ์„ฑ ์‹œ ๋ฌธ์ œ์ 

์•„๋ž˜์ฒ˜๋Ÿผ ๋™์ผํ•œ ๋กœ์ง์˜ ํ•จ์ˆ˜๋ฅผ ์ค‘๋ณตํ•ด์„œ ๋งŒ๋“ค ์ˆ˜ ์žˆ์ง€๋งŒ, ๋‹จ์ˆœํžˆ ํƒ€์ž…์„ ๋‹ค๋ฅด๊ฒŒ ๋ฐ›๊ธฐ ์œ„ํ•ด ์ค‘๋ณต๋œ ์ฝ”๋“œ๋ฅผ ๊ณ„์† ์ƒ์‚ฐํ•˜๋ฉด ์ฝ”๋“œ์–‘๋„ ๋น„๋Œ€ํ•ด์ง€๊ณ  ๊ฐ€๋…์„ฑ๋„ ๋–จ์–ด์ง„๋‹ค. ์œ ์ง€๋ณด์ˆ˜ ์ธก๋ฉด์—์„œ ๋ณด๋ฉด ์ตœ์•…์ด๋‹ค.

// ๋ฌธ์ž์—ด ํƒ€์ž…์„ ๋ฐ›๋Š” ๋™์ผ ๋กœ์ง์˜ ํ•จ์ˆ˜ 1
function logText(text: string): string {
  console.log(text);
  return text;
}

// ๋„˜๋ฒ„ ํƒ€์ž…์„ ๋ฐ›๋Š” ๋™์ผ ๋กœ์ง์˜ ํ•จ์ˆ˜ 2
function logNumber(num: number): number {
  console.log(num);
  return num;
}

const str = logText('Hello'); // ๊ฒฐ๊ณผ ๋ณ€์ˆ˜์— string๊ณผ ๊ด€๋ จ๋œ API์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
const num = logNumber(10); // ๊ฒฐ๊ณผ ๋ณ€์ˆ˜์— number์™€ ๊ด€๋ จ๋œ API๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์œ ๋‹ˆ์˜จ ํƒ€์ž… ์‚ฌ์šฉ์‹œ ๋ฌธ์ œ์ 

๋‘๋ฒˆ์งธ ๋ฐฉ๋ฒ•์ธ ์œ ๋‹ˆ์˜จ ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ ํƒ€์ž…์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ์•„๋ž˜์ฒ˜๋Ÿผ ๋ฌธ์ž์—ด์„ ๋„˜๊ฒจ ํ•จ์ˆ˜ ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋ฅผ ๋ณ€์ˆ˜์— ๋‹ด๊ณ  split() ๊ฐ™์€ ๋ฌธ์ž์—ด ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ๋ฌธ์ž์—ด๊ณผ ์ˆซ์ž ํƒ€์ž…์ด ๊ณตํ†ต์œผ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” API๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

function logText(text: string | number) {
  console.log(text);
  return text;
}

const strResult = logText('Hello');
strResult.split(''); // ts(2339) error!
const numResult = logText(10);

 

๋ฌธ์ž์—ด์„ ์ธ์ž๋กœ ๋„˜๊ธด ๋ฐ˜ํ™˜๊ฐ’์— split() ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์—๋Ÿฌ๊ฐ€ ๋‚œ๋‹ค. TS๋Š” ๋ฐ˜ํ™˜๊ฐ’์ด ์ •ํ™•ํžˆ ์–ด๋–ค ํƒ€์ž…์ธ์ง€ ๋ชจ๋ฅด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
๋ฌธ์ž์—ด๊ณผ ์ˆซ์ž ํƒ€์ž…์ด ๊ณตํ†ต์œผ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ์†์„ฑ์ด๋‚˜ API์— ๋Œ€ํ•ด์„œ๋งŒ Preview(์ž๋™์™„์„ฑ)์„ ์ œ๊ณตํ•œ๋‹ค.

 

ํ•ด๊ฒฐ์ฑ… — ์ œ๋„ค๋ฆญ ์‚ฌ์šฉ

์ด๋Ÿฐ ๋ฌธ์ œ๋“ค์€ ์ œ๋„ค๋ฆญ์„ ์ด์šฉํ•˜๋ฉด ๋ง๋”ํ•˜๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ์ ์— ํƒ€์ž…์„ ์ •์˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“  ํƒ€์ž…์ด ์˜ฌ ์ˆ˜ ์žˆ๊ณ , ๋ฐ˜ํ™˜๊ฐ’ ์—ญ์‹œ ํ˜ธ์ถœ ์‹œ์  ํƒ€์ž…์— ํ•ด๋‹นํ•˜๋Š” API๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

function logText<T>(text: T): T {
  console.log(text);
  return text;
}

const strResult = logText<string>('Hello');
strResult.split('').reverse().join(''); // 'olleH'

const numResult = logText<number>(10);
numResult.toString(); // '10'

 

์ˆซ์ž๋ฅผ ์ธ์ž๋กœ ๋„˜๊ธด ๋ฐ˜ํ™˜๊ฐ’์€ ์ˆซ์ž ํƒ€์ž…๊ณผ ๊ด€๋ จํ•œ API๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค

 

์ œ๋„ค๋ฆญ ํƒ€์ž… ์ •์˜


์ œ๋„ค๋ฆญ ์ธํ„ฐํŽ˜์ด์Šค

์ œ๋„ค๋ฆญ๋„ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ด์šฉํ•ด ํƒ€์ž… ์ •์˜๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์•„๋ž˜ ์ฝ”๋“œ์ฒ˜๋Ÿผ T ํƒ€์ž…์„ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›์•„ value์— ์žˆ๋Š” T ๋กœ ๋„˜๊ธฐ๋Š” ๊ตฌ์กฐ๋ผ๊ณ  ์ดํ•ดํ•˜๋ฉด ๋œ๋‹ค.

interface DropdownItem<T> {
  value: T;
  selected: boolean;
}

 

์ •์˜ํ•œ ํƒ€์ž…์€ ์•„๋ž˜์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค. ์ž…๋ ฅํ•œ ๋ฌธ์ž์—ด ํƒ€์ž… <string>์€ DropdownItem์˜ T๋กœ ๋„˜๊ฒจ์ง„๋‹ค. ์—ฌ๋Ÿฌ๊ฐ€์ง€ ํƒ€์ž…์„ ์ œ๋„ค๋ฆญ์„ ์ด์šฉํ•ด ํ•˜๋‚˜์˜ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ปค๋ฒ„ํ•˜๊ณ  ์žˆ๋‹ค. ํƒ€์ž… ์ฝ”๋“œ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์–ด์„œ ์œ ์šฉํ•˜๋‹ค.

const emails: DropdownItem<string>[] = [
  { value: 'naver.com', selected: true },
  { value: 'gmail.com', selected: false },
  { value: 'hanmail.net', selected: false },
];

const numberOfProducts: DropdownItem<number>[] = [
  { value: 1, selected: true },
  { value: 2, selected: false },
  { value: 3, selected: false },
];

 

์•„๋ž˜์ฒ˜๋Ÿผ ์—ฌ๋Ÿฌ ํƒ€์ž…์„ ๋ฐ›๋„๋ก ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

// ์œ ๋‹ˆ์˜จ ์—ฐ์‚ฐ์ž๋ฅผ ์ด์šฉํ•œ ๋ฐฉ๋ฒ•
function createDropdownItem(item: DropdownItem<string> | DropdownItem<number>) {
  // ...
}

const item = createDropdownItem(email);

// extends ํ‚ค์›Œ๋“œ๋ฅผ ์ด์šฉํ•œ ๋ฐฉ๋ฒ•
function createDropdownItem<T extends string | number>(item: DropdownItem<T>) {
  // ...
}

const item = createDropdownItem<string>(email);

 

๐Ÿ’ก ์œ„ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ธํ„ฐํŽ˜์ด์Šค ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํด๋ž˜์Šค๋„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋„˜๊ณผ ๋„ค์ž„ํŽ˜์ด์Šค๋Š” ์ œ๋„ค๋ฆญ์œผ๋กœ ์ƒ์„ฑํ•  ์ˆ˜ ์—†๋Š”์  ์ฐธ๊ณ .

 

์ œ๋„ค๋ฆญ ํด๋ž˜์Šค

์ œ๋„ค๋ฆญ ์ธํ„ฐํŽ˜์ด์Šค์™€ ๋น„์Šทํ•œ ๋ฐฉ์‹์œผ๋กœ ์ œ๋„ค๋ฆญ ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ํด๋ž˜์Šค ์ด๋ฆ„ ์šฐ์ธก์— <T> ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ ์‹œ ํƒ€์ž…์— ์–ด๋–ค ๊ฐ’์ด ๋“ค์–ด๊ฐˆ์ง€ ์ง€์ •ํ•˜๋ฉด ๋œ๋‹ค.

class GenericMath<T> {
  pi: T;
  sum: (x: T, y: T) => T;
}

const math = new GenericMath<number>();

 

ํ”„๋กœ๋ฏธ์Šค


์„œ๋ฒ„ ํ†ต์‹ ์„ ํ•˜๋Š” API ํ˜ธ์ถœ์„ ํ•  ๋•Œ ์ œ๋„ค๋ฆญ์ด ์ž์ฃผ ์“ฐ์ธ๋‹ค. ๋ณดํ†ต ์„œ๋ฒ„ ์‘๋‹ต Response ๊ฐ’ ๊ทœ์น™์— ์ œ๋„ค๋ฆญ์„ ์“ด๋‹ค. Promise๋Š” ์ œ๋„ค๋ฆญ ํƒ€์ž…์œผ๋กœ ์ •์˜๋œ๋‹ค.

// ๋ฐ˜ํ™˜๊ฐ’์€ Promise ํƒ€์ž…์˜ ๋ฌธ์ž์—ด ๋ฐฐ์—ด
function fetchItems(): Promise<string[]> {
  const items: string[] = ['a', 'b', 'c'];
  return new Promise((res) => res(items));
}

 

Async Await ํ‚ค์›Œ๋“œ์—์„  ์•„๋ž˜์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•œ๋‹ค.

interface Employee {
  id: number;
  employee_name: string;
  employee_salary: number;
  employee_age: number;
  profile_image: string;
}

// ์ „์ฒด ์ง์›๋“ค(๋ฐฐ์—ด) API ํ˜ธ์ถœ
const fetchEmployees = async (): Promise<Array<Employee> | string> => {
  const api = 'http://dummy.restapiexample.com/api/v1/employees';
  try {
    const response = await fetch(api);
    const { data } = await response.json();
    return data;
  } catch (error) {
    if (error) {
      return error.message;
    }
  }
};

// ์ง์› 1๋ช…(๊ฐ์ฒด) API ํ˜ธ์ถœ
const fetchEmployee = async (
  url: string,
  id: number,
): Promise<Record<string, string>> => {
  const response = await fetch(`${url}/${id}`);
  const { data } = await response.json();
  return data;
};

 


๊ธ€ ์ˆ˜์ •์‚ฌํ•ญ์€ ๋…ธ์…˜ ํŽ˜์ด์ง€์— ๊ฐ€์žฅ ๋น ๋ฅด๊ฒŒ ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค. ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ•ด ์ฃผ์„ธ์š”
๋ฐ˜์‘ํ˜•