Generics

μž¬μ‚¬μš© κ°€λŠ₯ν•œ μ»΄ν¬λ„ŒνŠΈλ₯Ό ꡬ좕할 수 μžˆλ‹€. μœ μ—°ν•œ κΈ°λŠ₯ 단일 νƒ€μž…μ΄ μ•„λ‹Œ λ‹€μ–‘ν•œ νƒ€μž…μ„ 처리 ν•  수 μžˆλŠ” μ»΄ν¬λ„ŒνŠΈλ₯Ό λ§Œλ“ λ‹€.

function indentity(arg: any): any {
  return arg;
}

anyλ₯Ό μ“°λŠ” 경우 νƒ€μž…μŠ€ν¬λ¦½νŠΈλ₯Ό μ•ˆμ“°κ² λ‹€λŠ” λœ»μ΄λž‘ κ°™λ‹€.

νƒ€μž… λ³€μˆ˜(type variable)

function idntity<T>(arg: T): T {
  ruturn arg;
}

identity ν•¨μˆ˜λŠ” λ‹€μ–‘ν•œ νƒ€μž…μ„ μ²˜λ¦¬ν•  수 μžˆλ‹€.

ν•¨μˆ˜ν˜ΈμΆœ 2κ°€μ§€ 방법

let output = identity<string>("myString");
let output = identity("myString");

κΊ½μ‡  κ΄„ν˜Έ(<>)μ•ˆμ— λͺ…μ‹œμ μœΌλ‘œ νƒ€μž…μ„ 전달할 ν•„μš”κ°€ μ—†λ‹€. 인자 myString 을 보고 Tλ₯Ό κ·Έ νƒ€μž…μœΌλ‘œ μ„€μ •ν•œλ‹€.

Generic Type Variables

ν•¨μˆ˜κ°€ TλŒ€μ‹ μ— T배열을 μ²˜λ¦¬ν•œλ‹€λ©΄

function loggingIdentity<T>(arg: T): T {
  console.log(arg.length); // 였λ₯˜: TλŠ” .length λ©”μ†Œλ“œλ₯Ό κ°€μ§€κ³  μžˆμ§€ μ•Šλ‹€.
  return arg;
}

였λ₯˜ 없이 μž‘μ„±ν•˜κΈ°: 2κ°€μ§€ 방법

function loggingIdentity<T>(arg: T[]): T[] {
  console.log(arg.length); // 였λ₯˜μ—†μŒ ArrayλŠ” .length 멀버가 μžˆμŠ΅λ‹ˆλ‹€.
  return arg;
}
function loggingIdenty<T>(arg: Array<T>): Array<T> {
  console.log(arg.length);
  return arg;
}

Generic Types

νƒ€μž… λ§€κ°œλ³€μˆ˜κ°€ λ¨Όμ € λ‚˜μ—΄λœ λΉ„ μ œλ„€λ¦­ ν•¨μˆ˜μ˜ νƒ€μž…

function identity<T>(arg: T): T {
  return arg;
}

let myIdentity: <T>(arg: T) => T = identity;

νƒ€μž… λ³€μˆ˜μ˜ μˆ˜μ™€ νƒ€μž… λ³€μˆ˜μ˜ μ‚¬μš©μ΄ μΌμΉ˜ν•˜λ©΄ μ œλ„€λ¦­ νƒ€μž… λ§€κ°œλ³€μˆ˜λ₯Ό λ‹€λ₯Έμ΄λ¦„ μ‚¬μš© κ°€λŠ₯

function identity<T>(arg: T): T {
  return arg;
}

let myIdentity: <U>(arg: U) => U = identity;

객체 λ¦¬ν„°λŸ΄ λ°©μ‹μ˜ 호좜 ν˜•μ‹

function identity<T>(arg: T): T {
  return arg;
}

let myIdentity: {<T>(arg: T): T} = identity;

객체 λ¦¬ν„°λŸ΄ 방식 + interface

interface GenericIdentityFn {
  <T>(arg: T): T;
}

function identity<T>(arg: T): T {
  return arg;
}

let myIdentity: GenericIdentityFn = identity;

μ œλ„€λ¦­ μΈν„°νŽ˜μ΄μŠ€λ₯Ό λ§€κ°œλ³€μˆ˜λ‘œ 이동할 수 μžˆλ‹€.

interface GenericIdentityFn<T> {
  (arg: T): T;
}

function identity<T>(arg: T): T {
  return arg;
}

let myIdentity: GenericIdentityFn<number> = identity;

Generic Classes

class GenericNumber<T> {
  zeroValue: T;
  add: (x: T, y: T) => T;
}

let myGenericNumber = new GenericNumber<number>();
myGenericNumber.zeroValue = 0;
myGenericNumber.add = function(x, y) { return x + y };

Generic Constraints

.length ν”„λ‘œνΌν‹°λ₯Ό κ°€μ§„ λͺ¨λ“  νƒ€μž…μ—μ„œ μž‘λ™ν•˜λ„λ‘ μ œν•œμ„ 두고 μ‹Άλ‹€. Tκ°€ 무엇이 될 수 μžˆλŠ”μ§€μ— λŒ€ν•œ μ œμ•½μœΌλ‘œμ„œ μš”κ΅¬ 사항을 μž‘μ„±ν•΄μ•Ό ν•œλ‹€.

interface 와 extends

interface Lengthwise {
  length: number;
}

function loggingIdentity<T extends Lengtwise>(arg: T): T {
  console.log(arg.length);
  return arg;
}

Using Type Parameters in Generic Constraints

function getProperty<T, K extends keyof T>(obj: T, key:K) {
  return obj[key];
}

let x = {a:1, b:2, c:3, d: 4};

getProperty(x, "a");
getProperty(x, "m"); // 였λ₯˜: keyof T에 ν•΄λ‹Ήλ˜μ§€ μ•ŠλŠ”λ‹€.

Using Class Types in Generics

μƒμ„±μž ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ 클래슀 νƒ€μž…μ„ μ°Έμ‘°ν•œλ‹€.

Last updated

Was this helpful?