Function & Generic

ν•™μŠ΅ ν‚€μ›Œλ“œ

  • ν•¨μˆ˜

  • μ œλ„€λ¦­

Function

ν•¨μˆ˜μ„ μ–Έμ‹

  • λ§€κ°œλ³€μˆ˜μ˜ νƒ€μž…μ„ 지정해주어야 ν•œλ‹€.

  • ν•¨μˆ˜μ˜ λ°˜ν™˜κ°’ νƒ€μž…μ€ μžλ™μœΌλ‘œ μΆ”λ‘ λ˜κΈ° λ•Œλ¬Έμ— λ‹€μŒκ³Ό 같이 μƒλž΅κ°€λŠ₯ν•˜λ‹€.

function add(x: number, y: number): number {
  return x + y;
}

function minus(x: number, y: number): number {
  return x - y;
}

function multiply(x: number, y: number): number {
  return x * y;
}

ν•¨μˆ˜ν‘œν˜„μ‹

  • ν•¨μˆ˜ 선언식과 λ™μΌν•˜κ²Œ λ§€κ°œλ³€μˆ˜μ˜ νƒ€μž…μ„ 지정해주어야 ν•œλ‹€.

const add = function (x: number, y: number) {
  return x + y;
};

const minus = function (x: number, y: number) {
  return x - y;
};

const multiply = function (x: number, y: number) {
  return x * y;
};

πŸ€” 그런데 ν•¨μˆ˜ ν‘œν˜„μ‹μ€ μ½”λ“œ 쀑볡인 뢀뢄듀이 μžˆλŠ”λ° μ€„μΌμˆ˜ μ—†μ„κΉŒ? type 별칭과 μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ‚¬μš©ν•΄μ„œ μ€‘λ³΅λœ μ½”λ“œλ₯Ό 쀄일 수 μžˆλ‹€! κ·Έλž˜μ„œ νƒ€μž…μŠ€ν¬λ¦½νŠΈλ₯Ό μ‚¬μš©ν•˜λŠ” 경우, ν•¨μˆ˜ν‘œν˜„μ‹κ³Ό ν™”μ‚΄ν‘œ ν•¨μˆ˜λ₯Ό μ„ ν˜Έν•œλ‹€.

type TCommonFu = (x: number, y: number) => number;

interface ICommonFu {
  (x: number, y: number): number;
}

const add: TCommonFu = function (x, y) {
  return x + y;
};

const minus: ICommonFu = function (x, y) {
  return x - y;
};

const multiply: ICommonFu = function (x, y) {
  return x * y;
};

μ œλ„€λ¦­

πŸ€” μ œλ„€λ¦­μ΄ ν•„μš”ν•œ 상황

ν•¨μˆ˜μ˜ λ§€κ°œλ³€μ˜ λŒœμ–‘ν•œ νƒ€μž…μ΄ μ§€μ •λ˜μ–΄μ•Ό ν•œλ‹€. κ·Έλ ‡λ‹€λ©΄ κ·Έλ•Œ λ§ˆλ‹€ νƒ€μž…μ„ μΆ”κ°€ν•΄μ£Όμ–΄μ•Ό ν•˜λŠ” κ²ƒμΌκΉŒ? λ§€κ°œλ³€μˆ˜κ°€ 길어지고 였히렀 μ½”λ“œκ°€ λ³΅μž‘ν•΄μ§€λŠ”λ°? κ·Έλ ‡λ‹€λ©΄ any μ§€μ •ν•΄μ•Όν•˜λŠ” 걸까? 그것도 μ•„λ‹ˆλ‹€! κ·Έλž˜μ„œ λ“±μž₯ν•œ κ°œλ…μ΄ μ œλ„€λ¦­ ν•¨μˆ˜μ΄λ‹€.

function getSize(values: number[] | string[] | (number | string)[]): number {
  return values.length;
}

getSize(['1', '2', '3']);
getSize([1, 2, 3]);
getSize(['1', '2', '3', 1, 3, 4]);

πŸ₯ μ œλ„€λ¦­ ν•¨μˆ˜

πŸ“– μ œλ„€λ¦­(Generic) : 일반적인 λ˜λŠ” 포괄적인 μ΄λΌλŠ” 뜻

  • 두루두루 λͺ¨λ“  νƒ€μž…μ˜ 값을 λ‹€ μ μš©ν•  μˆ˜λŠ” λ²”μš©μ μΈ ν•¨μˆ˜λ‘œ μ΄ν•΄ν•˜λ©΄ λœλ‹€.

function func<T>(value: T): T {
  return value;
}

let num = func(10); // number νƒ€μž…

ν•¨μˆ˜ 이름 뒀에 <> 와 T λ₯Ό μ„ μ–Έν•œλ‹€. 그리고 λ§€κ°œλ³€μˆ˜μ™€ λ°˜ν™˜κ°’μ˜ νƒ€μž…μ„ T 둜 μ„€μ •ν•œλ‹€. T 에 μ–΄λ–€ νƒ€μž…μ΄ 할당될 μ§€λŠ” ν•¨μˆ˜κ°€ 호좜될 λ•Œ κ²°μ •λœλ‹€.

func(10) 처럼 Number νƒ€μž…μ˜ 값을 인수둜 μ „λ‹¬ν•˜λ©΄ λ§€κ°œλ³€μˆ˜ value에 Number νƒ€μž…μ˜ 값이 μ €μž₯λ˜λ©΄μ„œ Tκ°€ Number νƒ€μž…μœΌλ‘œ μΆ”λ‘ λœλ‹€. μ΄λ•Œ TλŠ” Number νƒ€μž…μœΌλ‘œ μΆ”λ‘ λ˜κ³ , func ν•¨μˆ˜μ˜ λ°˜ν™˜κ°’ νƒ€μž… λ˜ν•œ Number νƒ€μž…μ΄ λœλ‹€.

πŸ‘©πŸ»β€πŸ’» ν•΄λ‹Ή μ½”λ“œλ₯Ό μ œλ„€λ¦­μ„ μ‚¬μš©ν•΄μ„œ μˆ˜μ •ν•΄λ³΄μž

function getSize(values: number[] | string[] | (number | string)[]): number {
  return values.length;
}
function getSize<T>(values: T[]): number {
  return values.length;
}

getSize(['1', '2', '3']);
getSize([1, 2, 3]);
getSize(['1', '2', '3', 1, 3, 4]);

πŸ€ΉπŸ»β€β™€οΈ μ œλ„€λ¦­μ˜ ν™œμš©

type TUserBase<T> = {
  name: string;
  age: number;
  likeFoods: T; // λͺ…ν™•ν•œ νƒ€μž…μ„ λ„£κΈ° μ–΄λ €μšΈλ•Œλ„ μ œλ„€λ¦­μ„ μ΄μš©ν•΄μ„œ μ •μ˜ ν•  수 μžˆλ‹€.
};

interface IUserBase<T> {
  name: string;
  age: number;
  likeFoods: T;
}

const personHong: TUserBase<string[]> = {
  name: '홍길동',
  age: 20,
  likeFoods: ['κΉ€λ°₯', 'ν”Όμž'],
};

const personKim: TUserBase<null> = {
  name: 'κΉ€μ² μˆ˜',
  age: 27,
  likeFoods: null,
};

const personLee: TUserBase<string> = {
  name: 'μ΄λ‚˜μ˜',
  age: 24,
  likeFoods: 'κΉ€λ°₯',
};

πŸ”— μ°Έκ³ 

Last updated